我在 Nest js 中使用类验证器来验证请求数据。在请求正文中,我有一个名为
isEmailOrPhone
的字段。要验证电子邮件,我需要 IsEmail
装饰器,要验证电话号码,我需要 IsPhoneNumber
装饰器来分别验证它们。
但是我如何验证可以是电子邮件或电话号码的字段?类验证器中是否有任何 OR 运算,如果其中任何一个为真,则给出 true?
喜欢:
@IsEmaail() || @IsPhoneNumber()
更新:
我还创建了如下所示的自定义验证器。
import { registerDecorator, ValidationOptions, ValidationArguments, IsEmail, IsPhoneNumber } from 'class-validator';
export function IsEmailOrPhone(validationOptions?: ValidationOptions) {
return function (object: Object, propertyName: string) {
registerDecorator({
name: 'IsEmailOrPhone',
target: object.constructor,
propertyName: propertyName,
options: validationOptions,
validator: {
validate(value: any, args: ValidationArguments) {
const isEmailValid = IsEmail(value);
const isPhoneValid = IsPhoneNumber(value);
return isEmailValid || isPhoneValid;
},
},
});
};
}
装饰器 IsEmail 和 IsPhoneNumber 返回类型为
PropertyDecorator
的数据,但验证函数需要返回 boolean
或 Promise<boolean>
。
那么如何发送布尔数据呢?
如果我没记错的话,你实际上会想使用
isEmail
和 isPhone
而不是 IsEmail
和 IsPhone
。据我所知,小写方法(is*
)是实际的验证方法,而大写方法(Is*
)是装饰器。