【发布时间】:2022-01-25 23:05:00
【问题描述】:
有没有办法或者是否可以在一个实体中拥有两个验证器?就像下面给出的示例代码一样,identifier 将接受电子邮件作为其有效负载,但它也将接受
号码/手机号码也作为其有效载荷。
@ApiProperty()
@IsString()
@IsNotEmpty()
@IsEmail()
identifier: string;
编辑:
我试过了,
@ApiProperty()
@IsString()
@IsNotEmpty()
@IsEmail()
@IsPhoneNumber('US')
identifier: string;
但它不起作用。
编辑 2: 我根据之前的帖子找到了一个参考代码,How to use else condition in validationif decorator nestjs class-validator?,我复制了他的验证类。
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;
}
枚举 -
export enum IdentifierType {
EMAIL = 'email',
MOBILE = 'mobile',
}
它确实适用于电子邮件,但尝试输入手机号码仍然不起作用。
【问题讨论】:
标签: node.js typescript validation nestjs