Skip to content

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 - 退出

适用场景

  1. 日志记录(请求方法、路径、耗时、状态码);
  2. 认证 / 授权(JWT 校验、权限拦截);
  3. 请求预处理(参数格式化、跨域配置);
  4. 响应后处理(统一响应格式、缓存);
  5. 限流 / 熔断(接口访问频率限制);
  6. 错误捕获(全局异常前置处理)。

总结

shell
1. 作用
   处理 HTTP 请求的预处理,可以访问 request response 对象,通常用来处理请求和响应式对象,可终止请求,终止响应,或者传递给下一个中间件
2. 调用时机
   客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应
3. 使用场景:记录日志、jwt 验证、请求数据验证和转换、响应头处理、性能监控
4. 特点
   可按顺序调用堆栈中的下一个中间件、执行 nest() 方法代表中间件通过、可同步或异步执行、可只对指定或所有路由
5. 创建命令
   nest g middleware logger
6. 应用级别(执行顺序:全局 > 控制器 >>
   全局中间件
   controller 级中间件
   controller 下的方法级中间件
   排除|前缀匹配中间件