是否有任何方法或可能在一个实体中拥有两个验证器?与下面给定的示例代码一样,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)
。