NestJS DTO 类设置 class-validator 和 class-transformer 执行顺序

Posted

技术标签:

【中文标题】NestJS DTO 类设置 class-validator 和 class-transformer 执行顺序【英文标题】:NestJS DTO class set class-validator and class-transformer execution order 【发布时间】:2021-11-04 03:46:06 【问题描述】:

在使用class-validatorclass-transformer 包描述NestJS 中的DTO 类时,有没有办法设置装饰器的执行顺序

foo 的值设置为null 时,以下代码将失败并出现错误:

需要一个字符串,但收到一个空值

@IsOptional()
@IsString()
@IsByteLength(1, 2048)
@Transform(( value ) => validator.trim(value))
@Transform(( value ) => validator.stripLow(value))
foo: string;

即使我有一个 isString 装饰器,它应该检查是否确实传递了一个字符串,并且必须已经无法不将执行传递给 @Transform 装饰器,但它没有失败。

【问题讨论】:

【参考方案1】:

Class-Validator 基于类工作。进入服务器的请求负载只是简单的 JSON 对象。为了改变这种行为,如果你使用的是它的ValidationPipe,Nest 必须首先从class-validator 调用plainToClass。因此,@Transform() 装饰器优先于其他类验证器装饰器,并首先被执行。您可以通过使用多个管道来解决此问题,或者可以为 @Transform() 装饰器提供默认值,但所发生的是预期的效果。

【讨论】:

以上是关于NestJS DTO 类设置 class-validator 和 class-transformer 执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

尝试安装类验证器和类转换器时,NestJS“警告 EBADENGINE 不支持的引擎 @angulardevkit”

自定义对象验证在 Nestjs DTO 中不起作用

如何在 Nestjs 上使用具有多个 dto 的一条路由?

为 NestJs REST API 创建 DTO、BO 和 DAO

NestJs:为啥我们不使用 DTO 来替换所有接口?

NestJs - DTO 和实体