用途
本资料用于掌握 NestJS 中守卫(Guards)与拦截器(Interceptors)的使用,主要面向需要在应用中实现认证、授权、日志记录以及请求/响应转换等横切关注点(cross-cutting concerns)的场景。
守卫(Guards)
基础
资料讲解 CanActivate 接口与 ExecutionContext 的概念,并给出基础守卫示例:通过 context.switchToHttp().getRequest() 获取请求对象进行校验。ExecutionContext 还可用于获取 HTTP 上下文、请求与响应对象,以及处理器(handler)与控制器(class)信息。守卫可通过 @UseGuards 施加在控制器类级别或方法级别。
认证守卫
资料给出多种认证模式示例:
- JWT 认证:使用 JwtService 校验 token,从 Authorization 头中以 Bearer 方式提取 token,校验通过后将 payload 挂载到 request['user'],失败抛出 UnauthorizedException。
- 会话认证:检查 request.session 与 request.session.userId。
- API Key 认证:从 x-api-key 头读取并与 ConfigService 中的配置值比对。
- 多策略认证:先尝试 JWT,失败后回退到 API Key。
基于角色的授权守卫
资料展示 RBAC 模式:通过 SetMetadata 定义 Roles 装饰器与 ROLES_KEY,RolesGuard 使用 Reflector 的 getAllAndOverride 从 handler 与 class 读取所需角色,并基于 request.user.roles 判断,无权限时抛出 ForbiddenException。此外还包含:
- 基于权限的守卫:通过 RequirePermissions 装饰器与 PERMISSIONS_KEY 定义,使用 every 检查用户权限集合。
- 资源属主守卫:根据请求参数中的资源 id 查询资源,校验资源归属或管理员角色,并将资源挂载到 request。
拦截器(Interceptors)
基础
资料讲解 NestInterceptor 接口与 CallHandler,基础拦截器可在调用前后执行逻辑,例如记录时间消耗。示例包含通过 map 进行响应转换与通过 catchError 进行错误处理。拦截器可通过 @UseInterceptors 施加在类或方法级别。
日志记录拦截器
使用 NestJS Logger 记录请求方法、URL、请求体、User-Agent,以及响应状态码与耗时;错误时记录错误信息与堆栈。另有性能监控拦截器,对超过 1000ms 的慢请求给出警告。
响应转换拦截器
- 统一响应包装:返回 statusCode、message 与 data 结构。
- 分页包装:从请求 query 读取 page 与 pageSize,返回 items、total、page、pageSize、totalPages。
- 剔除空值:递归移除对象与数组中的 null 字段。
缓存拦截器
使用 @nestjs/cache-manager 的 CACHE_MANAGER 注入 Cache,以 ${method}:${url} 作为缓存键,命中则通过 of 直接返回缓存结果,否则执行后写入缓存(示例 TTL 60000 毫秒)。另有条件缓存模式,通过 CacheKey 装饰器与 CACHE_KEY_METADATA 元数据控制是否缓存。
超时拦截器
使用 rxjs 的 timeout 操作符(示例为 5000 毫秒),在超时(TimeoutError)时抛出 RequestTimeoutException。资料还展示了基于元数据的动态超时设计(TIMEOUT_METADATA 与 Timeout 装饰器),该部分示例在提供的文本中未完整给出。
适用场景
适用于 NestJS 项目中需要统一处理身份认证与授权、请求日志与性能监控、响应格式统一、分页、缓存与超时控制的场景。
限制
资料中未提供关于安装步骤、版本要求、价格与性能效果的说明;部分代码示例(如动态超时拦截器的完整实现)在提供的文本中未完整呈现。