NestJs:为什么我们在NestJs中都需要DTO和接口

NestJs:为什么我们在NestJs中都需要DTO和接口,nestjs,Nestjs,NestJS文档展示了如何添加DTO以在控制器中使用,从而通过使用类验证器包来验证请求对象。描述的DTO有类型脚本类。现在,当控制器处理DTO(TS类)时,另一方面,NestJS提供者(或服务)使用TypeScript接口。这些DTO和接口的形状几乎相同 现在,我在这里看到了形状定义的重复。想知道是否需要这些接口 我们不能使DTOs成为形状和验证的真实来源吗?我们正在考虑的方法之一(使数据成为真相的来源)是,要让openapi生成器将DTO作为输入并生成openapi定义,另一个codegen可

NestJS文档展示了如何添加DTO以在控制器中使用,从而通过使用类验证器包来验证请求对象。描述的DTO有类型脚本类。现在,当控制器处理DTO(TS类)时,另一方面,NestJS提供者(或服务)使用TypeScript接口。这些DTO和接口的形状几乎相同

现在,我在这里看到了形状定义的重复。想知道是否需要这些接口

我们不能使DTOs成为形状和验证的真实来源吗?我们正在考虑的方法之一(使数据成为真相的来源)是,要让openapi生成器将DTO作为输入并生成openapi定义,另一个codegen可以从中生成一组typescript接口,供NestJS本身使用,并可与另一组消费应用程序(如Angular)共享


有没有人遇到过类似的问题?您对以上内容有何看法?感谢反馈。

我不是专家,但我根本不使用DTO。我真的看不出它们有什么用处。在每个模块中,我都有一个服务、模块、实体和控制器

我认为知道什么是
DTO
很重要

DTO(数据传输对象)
Java(J2EE)
设计的一个概念

它看起来像一个普通的
JavaBean
对象,它是为了在我们的后端,特别是在
分布式系统中,通过多层(例如
控制器
服务
数据库
)传输数据对象而创建的

DTO
型号

我们发送大量请求来查询我们想要的数据,这些数据可能会重复

Application->WebService->Database

  • 由于一些重复的请求,它会消耗大量的带宽
  • 不安全的是,它从
    数据库
    返回整个对象,其中包含一些不应公开的属性。顺便说一句,我们应该手动添加一些额外的代码来限制它,这很糟糕
  • 带有
    DTO
    型号

    它帮助我们处理数据对象


    NestJS
    指南中,
    DTO
    的作用类似于
    HTTP请求
    主体

    我认为,
    DTO
    包含:

    • 一些我们将使用但不在
      数据库中的属性
    DTO
    遮罩:

    • 一些我们不想公开的属性
    要与
    类验证器一起使用,
    DTO
    还可以帮助我们以优雅的方式验证数据

    有时,对象
    界面
    看起来是一样的


    我认为当我们的数据库集合庞大而复杂时,
    DTO
    很重要。

    为了扩展@Victor关于
    DTO
    概念及其作用的回答,我想指出,
    接口
    允许我们设定一个合同,它代表了我们应用程序中有意义的东西。然后,我们可以在其他需要的地方实施和/或扩展此合同,例如数据库对象的实体定义-
    DAO
    s、数据传输对象-
    DTO
    s以及业务模型定义

    此外,
    DTO的
    接口
    可以在后端和前端共享,这样两个项目都可以避免代码重复和对象之间的差异,以便于开发和维护。

    正如Nestjs doc所说:

    当我们使用TypeScript时,我们需要确定DTO(数据传输) 对象)模式。DTO是一个对象,它定义了数据的传输方式 通过网络发送。我们可以使用 TypeScript接口,或通过简单类。有趣的是,我们 建议在这里使用类。为什么?类是JavaScript的一部分 ES6标准,因此它们在 编译JavaScript。另一方面,由于TypeScript接口 在蒸腾过程中被移除,巢穴不能同时参考它们 运行时。这一点很重要,因为管道等功能可以 当它们可以访问 运行时的变量


    顺便说一句,尽管DTO是Java约定,但它不能解决通用字段的问题,例如:

    @Get(url/${variable})
    @Reponse({
       [$variable: string]: $value
    })
    
    TS接口只能解决这个问题,但不能用DTO来描述 为了说明这一点,您将通过一些硬编码的示例

    class ResponseDto {
      @ApiProperty({
        ...
        example: [...]
      })
      [$variable]: SomeTSInterface[]
    }
    
    @Reponse({ status: 200, type: ResponseDto })
    

    为什么在这里投票?这篇文章通过指出额外的复杂性对于较小的项目可能没有意义,为讨论增加了一些平衡。这是从文档中复制和粘贴的。请使用报价降价功能,或者说您复制并粘贴了它。