是否可以使用类验证器验证 2 个参数之一是否存在?

mra*_*101 5 javascript validation typescript class-validator nestjs

将类验证器与 NestJS 一起使用,我想验证用户是否提供了一个或propertyA一个propertyB,但他们不需要同时提供两者。

目前,我正在做类似的事情:

export class TestDto {
  @ValidateIf(obj => !obj.propertyB)
  @IsString()
  @IsNotEmpty()
  propertyA

  @ValidateIf(obj => !obj.propertyA)
  @IsString()
  @IsNotEmpty()
  propertyB
}
Run Code Online (Sandbox Code Playgroud)

如果他们没有提供任何参数,则会出现多个错误,指出propertyApropertyB是必需的并且应该是字符串等。

如果他们不提供这两个属性,我只想要一个错误,例如:“您必须提供 propertyA 或 propertyB。”

这可以使用 NestJS/class-validator 来完成吗?

小智 3

不知道类验证器中是否存在此功能,但您可以使用Pipes简单地实现此场景

只需创建一个自定义管道,然后定义那里的逻辑

import { PipeTransform, Injectable, ArgumentMetadata, HttpException } from '@nestjs/common';

@Injectable()
export class CustomValidationPipe implements PipeTransform {
  transform(value: TestDto , metadata: ArgumentMetadata) {
    if(value.porpertyA && value.porpertyB) throw new HttpException("You must provide propertyA or propertyB" , 400)
    else return value;
  }
}

Run Code Online (Sandbox Code Playgroud)

之后,您可以在控制器上使用该管道

  @Post()
  create(@Body( new CustomValidationPipe()) testDto: TestDto) {
    return "create Resource"
  }

Run Code Online (Sandbox Code Playgroud)

您还可以将它与内置验证管道结合使用,就像这样。在这种情况下,您的类验证器逻辑将首先执行,然后您的自定义管道将执行

  @Post()
  create(@Body(ValidationPipe ,  new CustomValidationPipe()) testDto: TestDto) {
    return "create Resource"
  }


Run Code Online (Sandbox Code Playgroud)

希望这可以帮助