我们需要再学习 :
dto 辅助依赖 class-validator
+ class-transformer 官网
DTO
是一个设计模式,主要用于在不同层或不同系统之间传递数据。DTO 的主要目的是将数据封装成一个对象,以便跨网络、不同模块或不同服务之间传输时,避免直接暴露底层的数据模型。
DTO 的特点:
- 封装数据:DTO 用来封装数据,它通常包含的是数据的属性,不包含业务逻辑。
- 跨层/跨系统传输:在应用架构中,DTO 常常用于不同的层(如:Controller 层和 Service 层之间)或者跨系统的通信(如:客户端与服务器之间)时传递数据。
- 简化数据交换:它可以避免直接传输复杂的实体对象,确保系统的安全性和解耦性。
- 适应不同需求:DTO 可以根据传输的需求做数据裁剪或转换,确保只传递必要的数据。
DTO 的使用场景:
- 客户端与服务端通信:比如在 Web 开发中,前端和后端之间通过 HTTP 请求和响应传输的数据通常就是 DTO。
- 层与层之间的数据传输:例如,在 MVC 架构中,Controller 和 Service 层之间通常会使用 DTO 来传递数据。
- 微服务之间的通信:微服务之间进行数据传输时,通常会使用 DTO 来避免暴露内部的业务实体。
DTO 与实体(Entity)的区别:
- Entity 通常是数据库中的数据模型,包含了更多的业务逻辑和数据库操作。
- DTO 通常只是数据容器,不包含任何业务逻辑,旨在简化数据的传递。
示例:
// User 实体(包含业务逻辑和数据库字段) class User {id: number;name: string;email: string;password: string; // 不应该暴露 }// UserDTO(用于前端交互,只包含需要暴露的数据) class UserDTO {id: number;name: string;email: string;constructor(user: User) {this.id = user.id;this.name = user.name;this.email = user.email;} }// 使用 DTO 来传递数据 const user = new User(); user.id = 1; user.name = "John"; user.email = "john@example.com"; user.password = "secret";// 创建 UserDTO 实例并返回给前端 const userDTO = new UserDTO(user);
相关依赖
1. class-validator:
class-validator
是一个用于对类对象进行验证的库。它允许你在 DTO 中定义验证规则,确保数据的有效性。通过使用装饰器(例如 @IsString()
, @IsInt()
等),你可以验证 DTO 中的数据是否符合预期的格式或规则。
示例:
import { IsString, IsInt, Min } from 'class-validator';class CreateUserDTO {@IsString()username: string;@IsInt()@Min(18)age: number; }
在这个例子中,class-validator
用来验证 CreateUserDTO
对象的 username
是否是字符串,age
是否是整数并且大于等于18。
2. class-transformer:
class-transformer
是一个库,主要用于将普通的 JavaScript 对象转换为类的实例,或者将类的实例转换为普通的 JavaScript 对象。它可以自动转换数据的类型,并支持一些特殊的转换功能,比如属性重命名、嵌套对象的转换等。
示例:
import { plainToClass } from 'class-transformer';class CreateUserDTO {username: string;age: number; }const plainObject = { username: 'John', age: 25 }; const userDTO = plainToClass(CreateUserDTO, plainObject);
plainToClass
函数将普通的 JavaScript 对象 plainObject
转换为 CreateUserDTO
类的实例。
DTO用来:
- 数据验证:通过
class-validator
检查数据的合法性。 - 数据传输:在不同层或组件之间传递数据。
- 数据转换:将普通的对象转换为类实例,能够使用类的方法和属性。
- 数据持久化:将 DTO 用作与数据库交互的数据模型。
- 提供增强的类型支持:确保类型安全和开发时的智能提示。