typescript - 如何在 validationif 装饰器 nestjs 类验证器中使用其他条件?

标签 typescript nestjs class-validator

我需要有条件地验证在 nestjs 类验证器中提交的输入。有一个 validateif 装饰器,但如何在 else 部分添加另一个验证?例如:如果第一个输入是电子邮件,如果它是电话匹配我的正则表达式,则使用电子邮件装饰器。

    @IsNotEmpty()
    @IsEnum(UsernameType)
    public type: UsernameType;

// enum has two value: phone and email

    @IsNotEmpty()
    @ValidateIf(o => o.type === UsernameType.PHONE )
    @Matches(/(09)[0-9]{9}/)
    username: number;

    @IsNotEmpty()
    @ValidateIf(o => o.type === UsernameType.EMAIL)
    @IsEmail()
    username: string;
    

最佳答案

我使用类验证器中提供的自定义验证类解决了这个问题。 基于: https://github.com/typestack/class-validator#custom-validation-classes .

Dto:


import { IsEmail, IsEnum, IsNotEmpty, Matches, Validate, ValidateIf } from "class-validator";
import { UsernameValidation } from "src/validations/username-validation";
import { UsernameType } from "../username-type.enum";

export class TypeDto {

    @IsNotEmpty()
    @IsEnum(UsernameType)
    public type: UsernameType;

    @Validate(UsernameValidation)
    @IsNotEmpty()
    username: string;
}

src/验证/用户名验证:

import { TypeDto } from '../user/dto/type.dto';
import { UsernameType } from '../user/username-type.enum';
import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments, Matches } from 'class-validator';

@ValidatorConstraint({ name: 'UsernameValidation', async: false })
export class UsernameValidation implements ValidatorConstraintInterface {
    validate(username: string, args: ValidationArguments) {

        if (JSON.parse(JSON.stringify(args.object)).type === UsernameType.PHONE) {


            var regexp = new RegExp('(09)[0-9]{9}');
            // "regexp" variable now validate iranian phone number.
            return regexp.test(username);
        } else {
            regexp = new RegExp("^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$");
            // "regexp" variable now validate email address.
            return regexp.test(username);
        }

    }

    defaultMessage(args: ValidationArguments) {

        if (JSON.parse(JSON.stringify(args.object)).type === UsernameType.PHONE) {
            return 'Enter a valid phone number.'
        } else {
            return 'Enter a valid email address.'
        }
    }
}

关于typescript - 如何在 validationif 装饰器 nestjs 类验证器中使用其他条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68610924/

相关文章:

typescript - 从枚举接口(interface)上的 prop 解析类型

typescript - --out 仅支持 'amd' 和 'system' 模块

javascript - 缺少 Express SSL 身份验证功能?

node.js - 如何在 NestJS 中模拟存储库、服务和 Controller (Typeorm 和 Jest)

typescript - 类验证器的匹配装饰器无法正常工作

规范化数据的 TypeScript 类型或接口(interface)

node.js - 无法在 View 目录 NestJs 中查找 View "index"

typescript - nestjs 拦截并修改传出的 http 请求

nestjs - 如何使用适当的 API 文档使 Nestjs DTO 中必需的两个字段之一?

javascript - 验证不适用于 Partial<DTO> - NestJS