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)
如果他们没有提供任何参数,则会出现多个错误,指出propertyA
和propertyB
是必需的并且应该是字符串等。
如果他们不提供这两个属性,我只想要一个错误,例如:“您必须提供 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)
希望这可以帮助