如何决定Nest.js中中间件的选用及区分各类Provider使用场景
Nest.js 各类 Provider 区分与场景选择
Nest 里的 middleware、pipe、guard、interceptor 虽然都属于请求处理链路的组件,但各司其职,对应不同的处理阶段和需求,别再混为一谈了,下面逐个拆解清楚:
1. Middleware(中间件)
- 核心定位:最贴近 HTTP 层面的通用预处理/后处理组件,处在请求进入路由之前、响应返回客户端之前的环节
- 适用场景:
- 全局日志记录:比如记录每个请求的 URL、请求方法、处理耗时
- 跨域配置:设置 CORS 响应头,允许前端跨域请求
- 请求内容初步清洗:过滤请求体里的非法字符、去除多余空格
- 静态资源托管:直接返回前端的静态文件(如 HTML、CSS)
- 关键特点:可以直接修改
request/response对象,也能决定是否中断请求链路(比如提前返回错误响应)
2. Pipe(管道)
- 核心定位:专注于数据的校验与转换,只针对请求的参数(query、param、body、自定义装饰器获取的参数)
- 适用场景:
- 参数类型转换:把 URL 里的字符串 ID 转为数字类型,避免后续业务代码里的类型错误
- 请求数据校验:用
class-validator校验请求体字段(比如邮箱格式是否合法、密码长度是否达标) - 响应数据格式化:把日期对象统一转为指定格式的字符串,保证返回数据的一致性
- 关键特点:只处理数据本身,不涉及请求上下文的其他操作,处理完成后将校验/转换后的数据传递给后续的守卫、控制器
3. Guard(守卫)
- 核心定位:路由访问权限控制,决定当前请求是否有权限进入对应的路由处理
- 适用场景:
- 身份认证校验:验证请求头里的 JWT token 是否有效,无效则拒绝访问
- 角色权限控制:判断当前用户是否为管理员,只有管理员才能执行删除、修改等敏感操作
- 路由白名单配置:允许登录、注册等无需认证的路由直接通过
- 关键特点:基于请求上下文(比如解析出的用户信息)做决策,返回布尔值或抛出异常来控制请求是否继续向下传递
4. Interceptor(拦截器)
- 核心定位:请求/响应的切面处理,可以包裹整个请求的生命周期(从请求进入到响应返回)
- 适用场景:
- 全局响应包装:把所有接口的返回数据统一封装成
{ code: 200, data: ..., message: 'success' }的格式 - 请求超时控制:设置请求处理的超时时间,超过则自动返回超时错误
- 全局异常转换:捕获控制器里抛出的各类异常,统一转换成友好的响应格式
- 性能监控统计:统计每个请求的处理耗时,输出到日志或监控系统
- 全局响应包装:把所有接口的返回数据统一封装成
- 关键特点:基于 RxJS 处理异步流,能在请求进入前、响应返回后插入自定义逻辑,还可以复制请求对象做重试等操作
快速选型指南
- 处理 HTTP 层面的通用操作(日志、CORS、静态资源)→ 用 Middleware
- 校验/转换请求参数或格式化响应数据 → 用 Pipe
- 控制路由的访问权限(认证、角色校验)→ 用 Guard
- 做全局切面处理(响应包装、超时控制、异常统一处理)→ 用 Interceptor
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

