NestJS文档展示了如何添加DTO以在Controller中使用,以通过使用class-validator包来验证请求对象。描述的DTO有TypeScript类。现在,虽然控制器处理DTO(TS类),但另一方面,NestJS提供程序(或服务)使用TypeScript接口。这些DTO和接口的形状几乎相同。
现在,我在这里看到形状定义的重复。并且想知道是否根本需要接口吗?
我们不能使DTO成为形状和验证的真相来源吗?我们正在考虑的一种方法(使DTO成为事实的来源)是,让openapi生成器将DTO作为输入并生成openapi定义,然后另一个代码生成器可以生成一组Typescript接口,供NestJS自己使用并且可以与另一组消费者应用程序(例如 Angular )共享。
有人遇到过类似的问题吗?您如何看待以上内容。反馈表示赞赏。
答案 0 :(得分:3)
我认为知道DTO
是很重要。
DTO(Data Transfer Object)
是Java(J2EE)
设计的概念。
它看起来像一个普通的Java Bean
对象,它是为在后端通过多层(例如controller
,service
,database
)传输数据对象而创建的,特别是在Distributed Systems
中。
没有DTO
模型
我们发送了很多请求来查询我们想要的某些数据,这些数据可能是重复的。
Application -> WebService -> Database
database
返回整个对象,该对象包含一些不应公开的属性。顺便说一句,我们应该手动添加一些其他代码来限制它,这很糟糕。 使用DTO
模型
它有助于我们处理数据对象。
在NestJS
的指南中,DTO
的行为类似于HTTP Request
的正文。
我认为DTO
包含:
Database
中不会使用。和DTO
掩码:
class-validator
与DTO
一起使用还可以帮助我们以一种优雅的方式验证数据。
有时与对象interface
看起来相同。
我认为DTO
在我们的数据库庞大而复杂的情况下至关重要。
答案 1 :(得分:3)
使用TypeScript时,我们需要确定DTO(数据传输对象)架构。 DTO是定义如何在网络上发送数据的对象。我们可以通过使用TypeScript接口或简单的类来确定DTO模式。有趣的是,我们建议在这里使用类。为什么?类是JavaScript ES6标准的一部分,因此,它们在编译的JavaScript中保留为真实实体。另一方面,由于TypeScript接口是在编译过程中删除的,因此Nest无法在运行时引用它们。这很重要,因为当管道在运行时访问变量的元类型时,诸如管道之类的功能就提供了更多的可能性。
答案 2 :(得分:0)
要扩展@Victor关于DTO
概念及其作用的答案,我想指出interfaces
允许我们设置一个代表应用程序中有意义的内容的合同。然后,我们可以在需要的其他地方实施和/或扩展此合同,例如数据库对象-DAO
,数据传输对象-DTO
和业务模型定义的实体定义。
interfaces
的{{1}}也可以在后端和前端之间共享,这样两个项目都可以避免代码重复和对象之间的差异,以简化开发和维护。
答案 3 :(得分:0)
顺便说一句,尽管 DTO 是 Java 约定,但它无法解决泛型字段的问题,例如:
@Get(url/${variable})
@Reponse({
[$variable: string]: $value
})
TS Interfaces 只能解决这个问题,但你不能在 DTO 中描述它 为了展示它,您将传递一些硬编码示例
class ResponseDto {
@ApiProperty({
...
example: [...]
})
[$variable]: SomeTSInterface[]
}
@Reponse({ status: 200, type: ResponseDto })
答案 4 :(得分:-1)
我不是专家,但我根本不使用DTO。我真的看不到它们的用处。在每个模块中,我都有一个服务,模块,实体和控制器。