什么是管道(Pipe)?
在 Nest.js 中,管道(Pipelines) 是一种强大的功能,用于预处理进入控制器方法的请求数据,如请求体、查询参数、路径参数等。管道允许开发者在数据到达控制器方法之前对数据进行转换、验证、清理或执行其他预处理任务。这使得 Nest.js 应用更加健壮、可维护和一致。
以下是 Nest.js 中管道的一些主要用途:
- 数据转换:管道如
ParseIntPipe
、ParseFloatPipe
、ParseArrayPipe
等可以将原始输入数据转换为应用内部所需的类型,如将字符串转换为整数或浮点数,或将字符串表示的数组转换为数组,保证了数据的一致性和可用性 - 数据验证:管道可以确保传入的数据符合预期的格式和规则。例如,使用
ValidationPipe
结合 class-validator,可以自动验证请求体或查询参数是否满足特定的DTO
(数据传输对象)定义,从而预防因数据格式错误引起的运行时异常 - 错误处理:如果数据不符合管道的规则,管道可以抛出异常,从而阻止请求的进一步处理,并向客户端返回适当的错误信息
- 一致性:管道有助于在整个应用中保持一致性,避免在不同的控制器或方法中重复相同的预处理逻辑
- 可插拔性和重用性:管道是可插拔的组件,可以很容易地在多个控制器或方法之间共享和重用
内置管道
Nest.js 自带九个开箱即用的管道:
ValidationPipe
:验证和转换传入的数据。它使用 class-validator 库来检查数据是否符合定义在DTOs
或请求模型上的验证规则ParseIntPipe
:将字符串类型的参数转换为整数ParseFloatPipe
:将字符串类型的参数转换为浮点数ParseBoolPipe
:将字符串类型的参数转换为布尔值ParseArrayPipe
:将字符串形式的数组转换为数组ParseUUIDPipe
:解析字符串并验证是否为UUID
ParseEnumPipe
:将传入的值转换为枚举类型中的成员DefaultValuePipe
:如果传入的参数是undefined
或null
,则使用默认值替换它ParseFilePipe
:用于处理上传的文件,它可以验证文件的类型、大小等,确保上传的文件符合预期
自定义管道
- 安装依赖
pnpm add class-validator class-transformer
- 新建
/pipe/validation.pipe.ts
文件:
import {
ArgumentMetadata, BadRequestException, Injectable, PipeTransform } from '@nestjs/common';
import {
plainToClass } from 'class-transformer';
import {
validate } from 'class-validator';
@Injectable()
export class ValidationPipe implements PipeTransform {
async transform(value: any, {
metatype }: ArgumentMetadata) {
if (!metatype || !this.toValidate(metatype)) {
// 如果没有传入验证规则,则不验证,直接返回数据
return value