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

NestJS DTO class set class-validator and class-transformer execution order

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

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

Expected a string but received a null

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

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

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