DTO中单个实体的两个验证器



是否有任何方法或可能在一个实体中拥有两个验证器?与下面给定的示例代码一样,identifier会接受电子邮件作为其有效负载,但它也会接受号码/移动电话号码作为其有效载荷。

@ApiProperty()
@IsString()
@IsNotEmpty()
@IsEmail()
identifier: string;

编辑:

我试过了,

@ApiProperty()
@IsString()
@IsNotEmpty()
@IsEmail()
@IsPhoneNumber('US')
identifier: string;

但它不起作用。

EDIT 2:我发现了一个基于前一个线程的参考代码,如何在decorator nestjs类验证器的验证中使用else条件?,我抄了他的验证课。

import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments } from "class-validator";
import { IdentifierType } from "../interface/access.interface";
@ValidatorConstraint({ name: 'IdentifierValidation', async: false })
export class IdentifierValidation implements ValidatorConstraintInterface {
validate(identifier: string, args: ValidationArguments) {
if (JSON.parse(JSON.stringify(args.object)).type === IdentifierType.MOBILE) {
var regexp = new RegExp('/^[+]?[(]?[0-9]{3}[)]?[-s.]?[0-9]{3}[-s.]?[0-9]{4,6}$/im');
// "regexp" variable now validate phone number.
return regexp.test(identifier);
} 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(identifier);
}
}
defaultMessage(args: ValidationArguments) {
if (JSON.parse(JSON.stringify(args.object)).type === IdentifierType.MOBILE) {
return 'Enter a valid phone number.'
} else {
return 'Enter a valid email address.'
}
}
}

DTO-

export class VerifyOtpDto {
@Validate(IdentifierValidation)
@ApiProperty()
@IsNotEmpty()
identifier: string;
@ApiProperty({ enum: IdentifierType })
@IsNotEmpty()
identifierType: IdentifierType;
}

ENUM-

export enum IdentifierType {
EMAIL = 'email',
MOBILE = 'mobile',
}

它确实可以处理电子邮件,但尝试输入手机号码仍然不起作用。

有两种方法可以做到这一点,首先使用regex:

@Matches(/YOUR_REGEX/, {message: 'identifier should be email or phone'})
identifier: string;

或者你可以从中得到这个想法:

@IsType(Array<(val: any) => boolean>)
@IsType([
val => typeof val == 'string',
val => typeof val == 'boolean',
])
private readonly foo: boolean | string;

当然,它可以在一个DTO列中获得多个验证器。

你检查过了吗https://www.npmjs.com/package/class-validator在这里

如果您想查看手机号码,可以使用@IsMobilePhone(locale: string)

相关内容

  • 没有找到相关文章

最新更新