如何确保至少有一个字段不为空?(如果只有一个不为空也可以)

16
我正在为我工作的API编写注册端点,使用NestJS和class-validator验证输入数据。用户可以使用电话号码或电子邮件地址或两者一起进行注册。因此,要验证输入,我应该确保至少提供其中之一。但是,我很难弄清楚如何在不搞砸的情况下执行它。
这是我的DTO:
export class register {
  @ApiModelProperty()
  @IsNotEmpty()
  @IsAlpha()
  firstName: string

  @ApiModelProperty()
  @IsNotEmpty()
  @IsAlpha()
  lastName: string

  @ApiModelProperty()
  @ValidateIf(o => o.email == undefined)
  @IsNotEmpty()
  @isIRMobile()
  phone: string

  @ApiModelProperty()
  @ValidateIf(o => o.phone == undefined)
  @IsNotEmpty()
  @IsEmail()
  email: string

  @ApiModelProperty()
  @IsNotEmpty()
  password: string
}

如您所见,我使用了条件验证,这适用于仅提供电话号码或电子邮件地址的情况。但问题在于当两者都提供时,其中之一将无法通过验证,并允许输入无效的值。

有什么建议吗?

2个回答

37

我认为你只需要添加

@ValidateIf(o => o.email == undefined || o.phone)
phone: string

@ValidateIf(o => o.phone == undefined || o.email)
email: string

编辑过的内容

增加一点内容

我建议这样验证:

@ValidateIf(o => !o.email || o.phone)
phone: string

@ValidateIf(o => !o.phone || o.email)
email: string

为了正确处理null0""(空字符串),否则这也会是正确的(但实际上不应该):

const data = new register();
data.phone = '';
data.email = '';

您也可以查看此功能请求:https://github.com/typestack/class-validator/issues/1581 - Kasir Barati

0
这是如何验证至少一个字段的方法,只有在至少一个字段正确时才会进行验证。
import {  IsNotEmpty, IsNumber, ValidateIf, Length } from 'class-validator';

    export class ProposalBody {
      @ValidateIf((req) => !req.proposalNo || req.mobileNumber)
      @IsNotEmpty()
      @IsNumber()
      @Length(10, 10, { message: "Invalid Mobile Number. It should be a 10-digit number." })
      mobileNumber: number;
    
      @ValidateIf((req) => !req.mobileNumber || req.proposalNo)
      @IsNotEmpty()
      @IsNumber()
      proposalNo: number;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接