用途:本技能面向 NestJS 应用,用于在请求进入路由处理器之前执行中间件代码,处理日志、认证、请求体或请求头解析、响应头添加、手动 CORS、限流、请求数据校验以及全局修改请求/响应对象等横切关注点。中间件在请求处理管道中先于守卫、拦截器和管道执行,是请求生命周期中最早执行的自定义代码。
主要能力:支持类中间件与函数式中间件。类中间件以 @Injectable() 装饰并实现 NestMiddleware 接口,use() 方法接收 req、res 与 next(),必须调用 next() 才能继续传递控制权,可借助依赖注入注入服务;函数式中间件适用于无依赖、无状态的简单场景,无需依赖注入。中间件可在模块中通过 configure(consumer: MiddlewareConsumer) 以 .apply() 与 .forRoutes() 应用到路由、控制器类,可指定 HTTP 方法,支持通配符(*、?、+、()),可用 .exclude() 排除路由,可一次应用多个中间件,并按应用顺序执行。全局中间件在 main.ts 中通过 app.use() 注册,注意全局中间件只能是函数式中间件。
典型示例:资料给出了日志、认证(如校验 JWT 或 API Key)、CORS、请求校验、限流、请求 ID 等中间件示例,以及结合 ConfigService、JwtService 的依赖注入用法;也提到可用 compression、body-parser、helmet 等库处理压缩、请求体解析与安全响应头。
使用方式要点:在模块类实现 NestModule 并定义 configure 方法注册中间件;使用 consumer.apply(...).forRoutes(...) 指定应用范围;需要时用 .exclude() 排除;简单场景可直接写函数或全局 app.use()。
限制与区分:中间件没有执行上下文,无法判断将要执行的具体处理器,因此认证/授权的精细判断更适合守卫,日志、缓存、结果转换等更适合拦截器。资料提示的最佳实践包括单一职责、除结束请求周期外始终调用 next()、简单场景用函数式、抛出合适的 HTTP 异常、注意中间件顺序、谨慎使用全局中间件、必要时借助依赖注入并注释行为。关于本技能的安装命令、收费与平台支持等信息,资料暂未提供。