Nest.js 如何使用 class-validator 和 class-transformer?

· 约 5 分钟读完 · 第 141 / 144 章

推荐答案

在 Nest.js 中使用 class-validator 和 class-transformer 可以通过以下步骤实现:

  1. 安装依赖: 首先需要安装 class-validator 和 class-transformer 这两个库。

  2. 创建 DTO(Data Transfer Object): 使用 class-validator 装饰器来定义验证规则。

  3. 在控制器中使用 DTO: 在控制器中使用 @Body() 装饰器来接收请求体,并使用 ValidationPipe 进行自动验证。

  4. 全局使用 ValidationPipe: 可以在 main.ts 中全局应用 ValidationPipe,这样就不需要在每个控制器中单独使用 @UsePipes。

  5. 使用 class-transformer 进行数据转换: 可以使用 class-transformer 对数据进行转换,例如将字符串转换为数字。

本题详细解读

1. class-validator 的作用

class-validator 是一个用于类属性验证的库,它通过装饰器的方式为类的属性添加验证规则。常见的装饰器包括 @IsString()、@IsInt()、@Min()、@Max() 等。这些装饰器可以确保传入的数据符合预期的格式和范围。

2. class-transformer 的作用

class-transformer 是一个用于类实例转换的库,它可以将普通的 JavaScript 对象转换为类的实例,或者将类的实例转换为普通的 JavaScript 对象。常见的用法包括将字符串转换为数字、将日期字符串转换为 Date 对象等。

3. ValidationPipe 的作用

ValidationPipe 是 Nest.js 提供的一个内置管道,它可以自动对传入的请求数据进行验证。如果数据不符合验证规则,ValidationPipe 会抛出异常,并返回 400 Bad Request 响应。

4. 全局使用 ValidationPipe

通过在 main.ts 中全局应用 ValidationPipe,可以避免在每个控制器中重复使用 @UsePipes 装饰器。这样可以简化代码,并确保所有请求都经过验证。

5. 数据转换的常见场景

在实际开发中,前端传递的数据可能是字符串形式,但后端需要将其转换为数字或其他类型。这时可以使用 class-transformer 的 @Transform 装饰器来实现数据转换。例如,将字符串形式的年龄转换为数字,并确保其符合最小值和最大值的限制。

通过结合 class-validator 和 class-transformer,可以有效地对请求数据进行验证和转换,确保数据的完整性和正确性。