как убедиться, что хотя бы одно поле не пустое? (нормально, если только одно не пустое) - PullRequest
0 голосов
/ 30 июня 2019

Я пишу конечную точку регистрации для 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
}

Как видите, я использовал условную проверку, которая работает в тех случаях, когда указан только один номер телефона или адрес электронной почты. Но проблема в том, что, когда оба предоставлены, один из них не будет проверен, и будет разрешено недопустимое значение.

Есть предложения?

1 Ответ

1 голос
/ 01 июля 2019

Я думаю, вам просто нужно добавить

@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

для правильной обработки null , 0 и "" (пустая строка)

в противном случае это также будет правильным (не должно быть):

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