如何使用 NestJS 中的类验证器、类转换器通过子 DTO 验证嵌套普通对象

问题描述 投票:0回答:1

我已经研究这个话题很长时间了。我看到现成的解决方案是 缺席在 NestJS 中效果很好,因为转换在验证之前不起作用。如果我们在验证管道中启用转换,它会在验证后在传递到控制器之前进行转换。装饰器

@ValidateNested()
仅验证 DTO 的实例。但从 REST 来看,简单的 JSON 没有任何转换。
@Type
@Transform
装饰器属于转换过程所以他们无能为力。我几乎准备好使用自定义验证器创建我的解决方案。如果存在现成的解决方案,请阻止我。

我在 StackOverflow 上看到很多类似的问题。他们都犯同样的错误。他们没有看到验证和转换两个不同的过程。有人还建议创建一个自定义装饰器。 问候。

nestjs class-validator class-transformer
1个回答
0
投票

我认为这次讨论中所做的假设并不完全正确。 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) {}
}

为了减少代码中的混乱,您可以使用 装饰器组合仅具有单个装饰器

© www.soinside.com 2019 - 2024. All rights reserved.