NestJS中的类转换器DTO是如何在运行时应用的



我第一次摆弄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默认情况下使用从装饰器和库class-transformer(abv.c-t(和class-validator(abv.c-v(发出的Typescript元数据,通过ValidaitonPipe进行主体验证。在编译时,Typescript将发出一些关于代码的元数据、方法中的参数、它们是否具有类类型、应该附加哪些元数据(designtype:paramsreq.body等(以及Nest或c-t/c-v在运行时读取的其他有用数据。Nest使用该元数据的一些将适当的值传递给管道,例如为装饰器设置了什么类类型(如LoginDto(以及该值来自请求的哪个部分(这由@Body()/@Query()/@Param()/等决定(,这些值在ArgumentMetadata下的transform()方法的第二个参数中传递给管道。然后,将类类型传递给c-t,以便可以调用plainToInstance(ClassType, value)来生成LoginDto的类实例,然后调用c-vvalidate来验证实例的每个参数是否与分配给该属性的@IsWhatever()装饰符正确匹配。真有趣的东西。

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

最新更新