【NestJS】中间件与管道:请求处理双雄对决

🧱 一、Middleware ------ 路由前的"门卫"

📍概念

Middleware 是在 请求进入路由(Controller)之前 执行的函数。

它可以拦截、修改请求,甚至终止请求(比如认证失败直接返回 401)。

⚙️ 主要作用

  • 处理 跨请求逻辑(比如日志、鉴权、限流)
  • 处理或修改 reqres 对象
  • 决定是否放行 next()

🧩 使用示例

ts 复制代码
// logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(`[${req.method}] ${req.originalUrl}`);
    next(); // 不调用 next() 就不会继续执行下去
  }
}

注册中间件:

ts 复制代码
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
import { UserController } from './user.controller';

@Module({ controllers: [UserController] })
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes(UserController);
  }
}

📍执行时机:在 Controller 之前

📍作用对象:整个请求

📍框架层面:基于 Express/Fastify


🧪 二、Pipe ------ 控制器内部的"检票员"

📍概念

Pipe 主要负责:

  1. 验证(Validation)
  2. 转换(Transformation)

它在请求被路由到 Controller 的方法参数之前 执行,

相当于"对门票(数据)进行检查和改造"。


🧰 典型用途

用途 示例
验证 检查 id 是不是数字、DTO 校验
转换 把字符串 '42' 转成数字 42

🧩 示例

ts 复制代码
import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';

@Injectable()
export class ParseIntPipe implements PipeTransform {
  transform(value: any) {
    const val = parseInt(value, 10);
    if (isNaN(val)) {
      throw new BadRequestException('参数必须是数字');
    }
    return val;
  }
}

// 使用
@Get(':id')
getUser(@Param('id', ParseIntPipe) id: number) {
  return `用户ID: ${id}`;
}

📍执行时机:Controller 方法调用前,对参数进行验证与转换

📍作用对象:参数级别

📍框架层面:Nest 自身机制,不依赖 Express


⚔️ 三、对比总结表

特性 Middleware Pipe
执行阶段 Controller 之前 Controller 方法参数解析时
作用范围 整个请求 单个参数
主要功能 日志、鉴权、限流、CORS 等 数据验证与类型转换
是否能阻止继续执行 ✅ 可以(不调用 next() ✅ 可以(抛出异常)
是否能修改请求数据 ✅ req/res 都能改 ✅ 只能改参数值
注册位置 configure() Controller 参数装饰器 / 全局管道
框架依赖 Express/Fastify 层 NestJS 层(独立于底层框架)

🧠 四、再形象点理解

想象一个"演唱会入场系统":

角色 对应概念 职责
安检大门 Middleware 检查是否携带违禁品(全局规则)
检票口 Guard 检查是否有票(权限认证)
验票员 Pipe 检查票号是否有效,格式是否正确(数据验证)
服务员 Interceptor 表演前后补充服务,比如格式化响应、缓存等

💡 实战建议

场景 用哪个
登录态校验、跨域、日志 Middleware
参数校验、类型转换(如 DTO 验证) Pipe
权限控制 Guard
响应结构统一化、性能日志 Interceptor

相关推荐
瀚高PG实验室7 小时前
java中间件无法连接数据库
java·数据库·中间件·瀚高数据库
之歆12 小时前
Day11_Express 深入解析:从中间件到项目实战
中间件·express
码农飞哥13 小时前
RocketMQ消费接口设计实战:为什么HTTP回调接口必须吞掉所有异常,始终返回成功?
网络协议·http·中间件·消息队列·rocketmq
硅谷秋水14 小时前
物理人工智能的驾驭工程:机器人中间件是驾驭层
人工智能·机器学习·语言模型·中间件·机器人
初中就开始混世的大魔王1 天前
6 Fast DDS-传输层
开发语言·c++·中间件·信息与通信
zwh12984540601 天前
【 Fast-DDS 源码分析(一):架构总览与模块介绍】
中间件·架构
放下华子我只抽RuiKe51 天前
FastAPI 全栈后端(六):中间件与依赖注入
ai·中间件·fastapi·ai编程·qwen·ai大模型·openclaw
初中就开始混世的大魔王2 天前
7 Fast DDS-持久化服务
c++·人工智能·中间件·自动驾驶·信息与通信
半夜修仙2 天前
RabbitMQ中如何保证消息的可靠性传输
java·分布式·中间件·rabbitmq·github·java-rabbitmq
fuquxiaoguang2 天前
中间件信创替换的政策法规依据与技术实现
中间件·政策法规·信创替换