我已经研究这个话题很长时间了。我看到现成的解决方案是 缺席在 NestJS 中效果很好,因为转换在验证之前不起作用。如果我们在验证管道中启用转换,它会在验证后在传递到控制器之前进行转换。装饰器
@ValidateNested()
仅验证 DTO 的实例。但从 REST 来看,简单的 JSON 没有任何转换。 @Type
和@Transform
装饰器属于转换过程所以他们无能为力。我几乎准备好使用自定义验证器创建我的解决方案。如果存在现成的解决方案,请阻止我。
我在 StackOverflow 上看到很多类似的问题。他们都犯同样的错误。他们没有看到验证和转换两个不同的过程。有人还建议创建一个自定义装饰器。 问候。
我认为这次讨论中所做的假设并不完全正确。 ValidationPipeline 在验证输入数据之前通过类转换器运行输入数据。不幸的是,类转换器不知道如何使用嵌套 DTO 处理属性。 您必须向父 DTO 添加两个装饰器:
@Type
(来自类转换器)和 @ValidateNested
来自类验证器。
这样,转换器可以正确地将嵌套属性转换为类实例,并且验证器知道它应该验证它。
以下示例适用于 GraphQL(代码优先),但可以在 REST API 中使用相同的原理
@InputType()
class SomeInput {
@Field()
@MaxLength(32, { each: true})
tags: string[]
}
@ArgsType()
class SomeArgs {
@Field()
@Type(() => SomeInput)
@ValidateNested()
data: SomeInput
}
class Resolver {
@Query
updateTags(@Args(ValidationPipe) args: SomeArgs) {}
}
为了减少代码中的混乱,您可以使用 装饰器组合仅具有单个装饰器