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



使用类验证器和NestJS,我想验证用户是否提供了propertyApropertyB,但他们不需要同时提供。

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

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

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

在他们都不提供财产的情况下,我只希望出现一个错误,比如:";您必须提供属性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文档(。

你可以在这篇文章中看到如何做到这一点。

最新更新