NestJS 中数据传输对象的目的是什么?

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-validatorruntypes存在的原因。

  • 谢谢@Jay McDoniel。我在我的私人课程中使用你的 Nest 存储库,非常好!谢谢两次! (2认同)

Fab*_*osa 6

在运行时,所有类型都会丢失,因此控制器接受来自请求正文的任何​​ JSON。如果您想要进行类型检查,则应该启用利用类变换器类验证器库的 ValidationPipe:

app.useGlobalPipes(
    new ValidationPipe({
      transform: true,
      transformOptions: {
        enableImplicitConversion: true,
      },
      validationError: { target: false, value: false },
    })
  ); 
Run Code Online (Sandbox Code Playgroud)