NestJS 中的模型与 DTO

Sye*_*Ali 4 data-transfer-objects dto nestjs

我对 NestJS 完全陌生。我已经看到,在 NestJS 中,创建了一个模型来指定数据的详细信息,例如,当创建一个简单的任务管理器时,当我们想要指定单个任务的外观时,我们在模型中指定它(下面的示例):

export interface Task {
  id: string;
  title: string;
  description: string;
  status: TaskStatus;
}

export enum TaskStatus {
  OPEN = 'OPEN',
  IN_PROGRESS = 'IN_PROGRESS',
  DONE = 'DONE',
}
Run Code Online (Sandbox Code Playgroud)

然而,后来我遇到了 DTO,其中再次描述了数据的形状。我的理解是,DTO 在传输数据时使用,即它描述了您将发布或获取的数据类型。

我的问题是,当我已经使用 DTO 来描述数据的形状时,为什么还要使用模型?

另外,我读到,通过 DTO,我们可以拥有单一事实来源,并且如果我们意识到数据结构需要更改,我们不必在控制器和服务文件中单独指定它,但这仍然意味着我们必须更新模型吗?

Jay*_*iel 10

大多数情况下,在很长一段时间内,您的 DTO 和您的模型可能并且将会彼此分歧。HTTP 请求的内容和返回的内容可能采用与数据库中保存的格式不同的格式,因此随着时间的推移,将它们分开可以带来更大的灵活性。这基本上涉及到DTO(数据传输对象)DAO(数据访问对象)的争论与 DTAO(数据传输/访问对象)(至少我是这么称呼它们)的争论。

这也涉及单一职责原则,因为每个类应该只处理一件事,并且只处理一件事。

还有一篇来自 Java 线程的 SO 帖子,其中讨论了您的想法