如何在 Nest.js dto 中选择性地使用类验证器装饰器

问题描述 投票:0回答:1

我在 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>

那么如何发送布尔数据呢?

nestjs dto class-validator
1个回答
0
投票

如果我没记错的话,你实际上会想使用

isEmail
isPhone
而不是
IsEmail
IsPhone
。据我所知,小写方法(
is*
)是实际的验证方法,而大写方法(
Is*
)是装饰器。

© www.soinside.com 2019 - 2024. All rights reserved.