【问题标题】:Is there a way to conditionally validate with class-validator?有没有办法用类验证器有条件地验证?
【发布时间】:2022-11-20 15:45:06
【问题描述】:

我正在为使用 Nest.js 的用户构建一个 CRUD
我想让 POST 和 PATCH 接收相同的 DTO,但有一些字段在 PATCH 中是可选的,但在 POST 中是强制性的。

除了保留所有属性 @IsOptional 并在 POST 请求的代码中手动编写验证之外,我找不到其他方法来执行此操作。

使用 class-validator 有更好的方法吗?

【问题讨论】:

  • 为什么不使用具有特定验证规则的 POST 和 PATCH 两个单独的模型?

标签: validation conditional-statements nestjs option-type class-validator


【解决方案1】:

NestJS 为你的问题提供了一个漂亮的解决方案,

你可以使用PartialType要创建具有相同字段但每个字段都是可选的类型,请使用 PartialType() 将类引用 (PsotDto) 作为参数传递:

export class PatchDto extends PartialType(PostDto) {}

【讨论】:

  • 谢谢,我还找到了一种在方法级别使用“@UsePipes(new ValidationPipe({ skipMissingProperties: true }))”的方法(并删除 globalPipes),但您的建议似乎是针对我的问题指定的
【解决方案2】:

你可以使用Custom validation classes, 因为nestjs uses it你也能做到。

【讨论】:

    【解决方案3】:

    你可以试试@ValidateIf条件验证

    如果 ValidateIf 返回 true 那么另一个验证将运行

    示例:在这种情况下,如果 o.otherProperty === 'value' 那么 @IsNotEmpty 将运行,否则它将不会运行

    export class Post {
      otherProperty: string;
    
      @ValidateIf(o => o.otherProperty === 'value')
      @IsNotEmpty()
      example: string;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 2017-10-26
      • 2011-08-22
      • 2015-06-19
      相关资源
      最近更新 更多