繁体   English   中英

NestJS 中的 class 变压器 DTO 如何在运行时应用?

[英]How is the class transformer DTO in NestJS being applied at runtime?

我第一次弄乱了 NestJS 和类验证器。 在那种情况下,我遇到了一些我不太理解的东西,并且无法在网上找到解释。

我正在努力理解图书馆究竟是如何理解我的 DTO 以及什么是有效的,什么是无效的,因为 DTO 仅用作一种类型。 这究竟是如何工作的?

这是一个示例 DTO:

export class LoginDto {
  @IsEmail()
  email: string;

  @IsString()
  password: string;
}

这是 NestJS 中的一个示例,我根据 DTO 验证正文:

  @Post('login')
  login(@Body() body: LoginDto) {
    return this.authService.login(body);
  }

因此,再次重申我的问题。 当仅将主体声明为 TYPE 时,如何针对 DTO 验证主体,这肯定与运行时没有任何关系,对吧? 正确的?

提前致谢:)

因此,NestJS 默认使用装饰器发出的 Typescript 元数据以及库class-transformer器(abv.ct)和class-validator (abv.cv)通过ValidaitonPipe进行主体验证。 在编译时,Typescript 将发出一些关于代码的元数据,方法中有哪些参数,如果它们具有 class 类型,应该附加哪些元数据( designtype:paramsreq.body等),以及其他有用的数据Nest 或ct / cv在运行时读取。 Nest 使用其中一些元数据将正确的值传递给 pipe,例如为装饰器设置的 class 类型(如您的LoginDto )以及该值来自请求的哪一部分(这由@Body() / @Query()确定@Query() / @Param() /etc) 并将这些传递给ArgumentMetadatatransform()方法的第二个参数中的 pipe。 然后,将 class 类型传递给ct以便可以调用plainToInstance(ClassType, value)来生成 LoginDto 的LoginDto实例,然后调用cvvalidate来验证实例的每个参数是否正确匹配@IsWhatever()分配给属性的装饰器。 真的很有趣的东西。

我强烈建议您在运行build命令后查看已发出的编译 JavaScript 以更好地了解正在发出的内容,从而在运行时读取

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM