使用类验证器和NestJS,我想验证用户是否提供了propertyA
或propertyB
,但他们不需要同时提供。
目前,我正在做一些类似的事情:
export class TestDto {
@ValidateIf(obj => !obj.propertyB)
@IsString()
@IsNotEmpty()
propertyA
@ValidateIf(obj => !obj.propertyA)
@IsString()
@IsNotEmpty()
propertyB
}
如果它们不提供任何参数,则会出现多个错误,表示propertyA
和propertyB
是必需的,并且应该是字符串等。
在他们都不提供财产的情况下,我只希望出现一个错误,比如:";您必须提供属性A或属性B">
这可以使用NestJS/类验证器来完成吗?
不知道类验证器中是否存在此功能,但您可以使用Pipe简单地实现此场景
只需创建自定义管道,然后在那里定义的逻辑
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;
}
}
之后,您可以使用控制器上的管道
@Post()
create(@Body( new CustomValidationPipe()) testDto: TestDto) {
return "create Resource"
}
您也可以像这样将其与内置验证管道结合使用。在这种情况下,您的类验证器逻辑将首先执行,然后您的自定义管道将执行
@Post()
create(@Body(ValidationPipe , new CustomValidationPipe()) testDto: TestDto) {
return "create Resource"
}
希望这能帮助
您可以通过向类验证器添加一个新的自定义装饰器来实现这一点。
首先,您必须添加一个自定义验证类(read document(,然后为该类定义一个自定义装饰器(read文档(。
你可以在这篇文章中看到如何做到这一点。