-
中间件 → 负责最外层的请求处理,比如日志;
-
守卫 → 决定“是否允许”继续执行;
-
拦截器 → 对请求/响应进行包装;
-
控制器 & 服务 → 处理实际的业务逻辑。
中间件
这里的中间件作用是提取请求方法和URL记录请求开始时间它在路由处理前被调用,接着计算请求处理耗时然后输出格式化的日志信息。最后还需要调用
next() 将控制权传递给下一个中间件或路由处理器,不然流程会被一直挂起。
中间件像请求前的“门卫” ,只能处理请求前或响应结束后的操作,无法直接修改 Controller 返回值
守卫
Guard(守卫)是一种用于保护路由端点的机制。类似于中间件,在请求到达路由处理程序之前,Guard 可以对请求进行拦截并在特定条件下允许或拒绝请求。
例如在这里我对身份权限做出了限制,只有role为admin的用户可以对账号的密码进行修改。
当我使用普通账号时,guard会拒绝访问路由
下面是admin账号进行密码修改,显示成功
拦截器
-
拦截器能够在全局、Controller 级别或方法级别被使用
-
拦截器在请求前执行逻辑 → 调用
next.handle()执行 Controller → 在响应后执行 tap() 的逻辑
将拦截器放在单个路由前用于测试:
作用:记录请求开始/结束、耗时,方便调试和性能分析
拦截器像请求前后的“管家”,能在 Controller 前后执行逻辑,能修改返回值或做额外处理
JWT
首先通过login接口得到username,password,role生成的token
当用户请求受保护的路由时:
JwtAuthGuard
- 自动调用 JWT 策略 (
JwtStrategy) - 拦截请求,提取请求头中的 token
jwt.strategy
-
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()→ 提取 Bearer token -
secretOrKey校验 token 签名是否合法 -
校验通过 → 调用
validate(payload)方法 -
validate()返回对象(例如{ userId, username, role }),被附加到req.user