Jon*_*oep 8 data-transfer-objects dto typescript nestjs
我正在努力解决一个问题。我正在关注 NestJS 的文档。NodeJS 的后端框架。该文档提到了 DTO(数据传输对象)。我创建了一个用于创建用户的 DTO:
export class CreateUserDto {
readonly email: string;
readonly password: string;
}
Run Code Online (Sandbox Code Playgroud)
与此结合:
@Post('create')
createUser(@Body() userData: CreateUserDto): User {
return this.usersService.createUser(userData);
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我可以使用任何类型的主体向这条路线发出 post 请求。我可以在正文中放置任何类型的信息而不会出错。这种 DTO 的全部意义在于只允许身体中的某些信息,对吗?我还尝试了导出接口 CreateUserDTO,而不是使用导出类 CreateUserDTO,但这也不起作用。我也是 typescript 和 NestJS 的新手。有没有人能够解释为什么它没有按我预期的方式工作,或者这种数据传输对象的目的是什么?
Jay*_*iel 12
对于开发人员和使用 API 的人来说,它本身的 DTO 更像是一个指南,以了解请求主体期望的形状,它实际上并没有自行运行任何验证。但是,使用 Typescript,您可以从类验证器库中添加装饰器,并使用内置的 ValidationPipe并对传入的请求运行验证,以便只有预期的请求正文可以进来。
简而言之,DTO 是请求应该是什么样子的定义,但是因为 JavaScript 是一种动态语言,所以您可以发送任何内容。这就是图书馆喜欢class-validator和runtypes存在的原因。
在运行时,所有类型都会丢失,因此控制器接受来自请求正文的任何 JSON。如果您想要进行类型检查,则应该启用利用类变换器和类验证器库的 ValidationPipe:
app.useGlobalPipes(
new ValidationPipe({
transform: true,
transformOptions: {
enableImplicitConversion: true,
},
validationError: { target: false, value: false },
})
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4673 次 |
| 最近记录: |