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

Posted

技术标签:

【中文标题】NestJS 中数据传输对象的目的是啥?【英文标题】:What is the purpose of a Data Transfer Object in NestJS?NestJS 中数据传输对象的目的是什么? 【发布时间】:2020-04-11 08:10:12 【问题描述】:

我正在努力解决一个问题。我正在关注 NestJS 的文档。 NodeJS 的后端框架。该文档提到了 DTO(数据传输对象)。我创建了一个用于创建用户的 DTO:

export class CreateUserDto 
    readonly email: string;
    readonly password: string;

结合这个:

@Post('create')
createUser(@Body() userData: CreateUserDto): User 
    return this.usersService.createUser(userData);

出于某种原因,我可以使用任何类型的正文向此路由发出发布请求。我可以在正文中放置任何类型的信息而不会出错。这样一个 DTO 的全部意义在于只允许身体中的某些信息,对吗?除了使用导出类 CreateUserDTO,我还尝试了导出接口 CreateUserDTO,但这也不起作用。我也是打字稿和 NestJS 的新手。有没有人能够解释为什么它没有按我预期的方式工作或这种数据传输对象的目的是什么?

【问题讨论】:

【参考方案1】:

在运行时所有类型都会丢失,因此控制器接受来自请求正文的任何​​ JSON。如果要进行类型检查,则应启用利用 class-trasformer 和 class-validator 库的 ValidationPipe:

app.useGlobalPipes(
    new ValidationPipe(
      transform: true,
      transformOptions: 
        enableImplicitConversion: true,
      ,
      validationError:  target: false, value: false ,
    )
  ); 

【讨论】:

【参考方案2】:

它本身的 DTO 更多的是为开发人员和使用 API 的人提供指导,以了解请求主体期望的形状,它实际上并不运行任何验证它自己。但是,使用 Typescript,您可以从 class-validator 库中添加装饰器,并使用 built-in ValidationPipe 并对传入的请求进行验证,以便只有预期的请求正文可以进入。

简而言之,DTO 是对请求应该外观的定义,但由于 javascript 是一种动态语言,您可以发送任何内容。这就是 class-validatorruntypes 这样的库存在的原因。

【讨论】:

感谢@Jay McDoniel。我在我的私人课程中使用你的巢存储库,非常好!再次感谢!

以上是关于NestJS 中数据传输对象的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Nestjs 日志响应数据对象

在 NestJS 中,有没有办法将数据从 Guards 传递到控制器?

在 NestJs 中配置依赖 DynamicModules 的最佳方法

NestJS MQTT 微服务的有效@MessagePattern 是啥?

面向对象三大特征是啥?

如何使用 dto 验证 nestjs 中的对象数组