NestJs:为什么我们在NestJs中都需要DTO和接口
NestJS文档展示了如何添加DTO以在控制器中使用,从而通过使用类验证器包来验证请求对象。描述的DTO有类型脚本类。现在,当控制器处理DTO(TS类)时,另一方面,NestJS提供者(或服务)使用TypeScript接口。这些DTO和接口的形状几乎相同 现在,我在这里看到了形状定义的重复。想知道是否需要这些接口 我们不能使DTOs成为形状和验证的真实来源吗?我们正在考虑的方法之一(使数据成为真相的来源)是,要让openapi生成器将DTO作为输入并生成openapi定义,另一个codegen可以从中生成一组typescript接口,供NestJS本身使用,并可与另一组消费应用程序(如Angular)共享NestJs:为什么我们在NestJs中都需要DTO和接口,nestjs,Nestjs,NestJS文档展示了如何添加DTO以在控制器中使用,从而通过使用类验证器包来验证请求对象。描述的DTO有类型脚本类。现在,当控制器处理DTO(TS类)时,另一方面,NestJS提供者(或服务)使用TypeScript接口。这些DTO和接口的形状几乎相同 现在,我在这里看到了形状定义的重复。想知道是否需要这些接口 我们不能使DTOs成为形状和验证的真实来源吗?我们正在考虑的方法之一(使数据成为真相的来源)是,要让openapi生成器将DTO作为输入并生成openapi定义,另一个codegen可
有没有人遇到过类似的问题?您对以上内容有何看法?感谢反馈。我不是专家,但我根本不使用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 })
为什么在这里投票?这篇文章通过指出额外的复杂性对于较小的项目可能没有意义,为讨论增加了一些平衡。这是从文档中复制和粘贴的。请使用报价降价功能,或者说您复制并粘贴了它。