【问题标题】:How to use else condition in validationif decorator nestjs class-validator?如何在validationif装饰器nestjs class-validator中使用else条件?
【发布时间】:2021-10-07 04:15:20
【问题描述】:

我需要有条件地验证 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;
    

【问题讨论】:

    标签: typescript nestjs class-validator


    【解决方案1】:

    我使用类验证器中提供的自定义验证类解决了这个问题。 基于: 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/validations/用户名验证:

    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.'
            }
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-27
      • 2019-03-03
      • 2021-10-25
      • 2021-04-11
      • 2021-03-13
      • 2021-11-14
      • 2019-09-10
      • 2020-03-09
      相关资源
      最近更新 更多