我第一次摆弄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:params
、req.body
等(以及Nest或c-t
/c-v
在运行时读取的其他有用数据。Nest使用该元数据的一些将适当的值传递给管道,例如为装饰器设置了什么类类型(如LoginDto
(以及该值来自请求的哪个部分(这由@Body()
/@Query()
/@Param()
/等决定(,这些值在ArgumentMetadata
下的transform()
方法的第二个参数中传递给管道。然后,将类类型传递给c-t
,以便可以调用plainToInstance(ClassType, value)
来生成LoginDto
的类实例,然后调用c-v
的validate
来验证实例的每个参数是否与分配给该属性的@IsWhatever()
装饰符正确匹配。真有趣的东西。
我强烈建议您在运行build
命令后查看已发出的已编译JavaScript,以更好地了解正在发出的内容,从而在运行时读取