NestJS 中间件
NestJS 中间件是基于 Express/Fastify 底层中间件系统的封装,遵循洋葱模型设计,是拦截 HTTP 请求 / 响应生命周期的核心扩展点。
生命周期位置
排第一位,在守卫之前
因此可拿到所有请求参数
shell
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应核心原理
洋葱模型:进入时正序,退出时逆序
请求进入时,按中间件注册顺序从外到内执行;
到达路由处理器(Controller)执行核心业务;
响应返回时,按中间件注册顺序从内到外反向执行。
ts
// 中间件1
(req, res, next) => {
console.log('中间件1 - 进入');
next(); // 执行下一个中间件
console.log('中间件1 - 退出');
};
// 中间件2
(req, res, next) => {
console.log('中间件2 - 进入');
next(); // 执行控制器
console.log('中间件2 - 退出');
};
// 控制器
() => console.log('控制器执行');
// 输出顺序:
// 中间件1 - 进入
// 中间件2 - 进入
// 控制器执行
// 中间件2 - 退出
// 中间件1 - 退出适用场景
- 日志记录(请求方法、路径、耗时、状态码);
- 认证 / 授权(JWT 校验、权限拦截);
- 请求预处理(参数格式化、跨域配置);
- 响应后处理(统一响应格式、缓存);
- 限流 / 熔断(接口访问频率限制);
- 错误捕获(全局异常前置处理)。
总结
shell
1. 作用
处理 HTTP 请求的预处理,可以访问 request 和 response 对象,通常用来处理请求和响应式对象,可终止请求,终止响应,或者传递给下一个中间件
2. 调用时机
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应
3. 使用场景:记录日志、jwt 验证、请求数据验证和转换、响应头处理、性能监控
4. 特点
可按顺序调用堆栈中的下一个中间件、执行 nest() 方法代表中间件通过、可同步或异步执行、可只对指定或所有路由
5. 创建命令
nest g middleware logger
6. 应用级别(执行顺序:全局 > 控制器 > 方法> )
全局中间件
controller 级中间件
controller 下的方法级中间件
排除|前缀匹配中间件