NestJS 管道
管道是 NestJS 核心的中间层扩展机制,专注于处理器(控制器方法)参数的验证与转换,是实现输入数据规范化、保障业务逻辑健壮性的关键组件。
生命周期位置
排第三位
管道执行于守卫之后,拦截器(前置)之前
shell
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应核心能力
- 数据转换:将输入数据转换为期望格式(如字符串转数字、日期字符串转 Date 对象);
- 数据验证:校验输入数据合法性,不合法时抛出异常,Nest 会自动转换为 HTTP 400 响应;
- 异步支持:transform 方法可返回 Promise,支持异步验证(如查询数据库校验唯一性);
实践
- 优先使用全局 ValidationPipe:覆盖大部分 DTO 验证场景,减少重复代码;
- 参数级别管道用于精细化校验:如手机号、UUID、业务专属规则;
- 管道仅做数据验证 / 转换:避免在管道中编写业务逻辑(如复杂的数据库操作);
- 异步管道注意性能:数据库查询等异步操作需考虑缓存或批量处理;
- DTO 设计遵循单一职责:一个 DTO 对应一个接口的参数规则,避免复用导致规则混乱;
- 开启 transform 选项:自动转换参数类型,提升类型安全性。
总结
shell
1. 作用
主要用于请求数据的转换和验证,转换:将输入数据转换为所需的形式,验证:验证输入数据,如果有效则通过,否则抛出异常
2. 调用时机
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应
3. 使用场景:
数据清洗:去除字符串两端的空格
类型转换:将字符串转换为数字
数据验证:验证输入是否符合预期格式
默认值设置:为缺失的参数提供默认值
数据脱敏:移除或替换敏感信息
4. 创建命令
nest g middleware pipe
5. 特点
nest 存在一些内置管道,可以直接调用
一般结合第三方库 class-validator class-transformer 一起使用
6. 应用级别(执行顺序:全局 > 控制器 > 方法 > 参数 )
全局管道
控制器级管道
方法级管道
参数级管道