[英]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:params
, req.body
等),以及其他有用的数据Nest 或ct
/ cv
在运行时读取。 Nest 使用其中一些元数据将正确的值传递给 pipe,例如为装饰器设置的 class 类型(如您的LoginDto
)以及该值来自请求的哪一部分(这由@Body()
/ @Query()
确定@Query()
/ @Param()
/etc) 并将这些传递给ArgumentMetadata
下transform()
方法的第二个参数中的 pipe。 然后,将 class 类型传递给ct
以便可以调用plainToInstance(ClassType, value)
来生成 LoginDto 的LoginDto
实例,然后调用cv
的validate
来验证实例的每个参数是否正确匹配@IsWhatever()
分配给属性的装饰器。 真的很有趣的东西。
我强烈建议您在运行build
命令后查看已发出的编译 JavaScript 以更好地了解正在发出的内容,从而在运行时读取
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.