🧱 一、Middleware ------ 路由前的"门卫"
📍概念
Middleware 是在 请求进入路由(Controller)之前 执行的函数。
它可以拦截、修改请求,甚至终止请求(比如认证失败直接返回 401)。
⚙️ 主要作用
- 处理 跨请求逻辑(比如日志、鉴权、限流)
- 处理或修改
req
、res
对象 - 决定是否放行
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 主要负责:
- 验证(Validation)
- 转换(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 |