如果装饰器嵌套类验证器,如何在验证中使用ELSE条件? [英] How to use else condition in validationif decorator nestjs class-validator?

查看:23
本文介绍了如果装饰器嵌套类验证器,如何在验证中使用ELSE条件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要有条件地验证nestjs,class-validator中的输入字段。有一个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/validations/username-validation:

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

这篇关于如果装饰器嵌套类验证器,如何在验证中使用ELSE条件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆