news 2026/6/10 12:56:12

NestJs-拦截器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NestJs-拦截器

NestJS 拦截器概述

拦截器(Interceptor)是 NestJS 的核心功能之一,用于在方法执行前后添加额外的逻辑。拦截器基于面向切面编程(AOP)思想,常用于日志记录、性能监控、响应格式统一等场景。

拦截器的核心功能

  • 方法执行前/后注入逻辑:可以在目标方法执行前后插入自定义代码。
  • 修改请求/响应数据:拦截请求或响应的数据流并对其进行转换。
  • 异常处理:捕获并处理目标方法抛出的异常。
  • 异步拦截:支持ObservablePromise的异步操作。

创建拦截器

拦截器是一个实现了NestInterceptor接口的类,需使用@Injectable()装饰器。核心方法是intercept,接收两个参数:

  • context: ExecutionContext:提供当前请求的上下文信息。
  • next: CallHandler:调用目标方法的控制器逻辑。
import{CallHandler,ExecutionContext,Injectable,NestInterceptor}from'@nestjs/common';import{map,Observable}from'rxjs';@Injectable()exportclassSerializeInterceptorimplementsNestInterceptor{intercept(context:ExecutionContext,next:CallHandler):Observable<any>{console.log('拦截器执行之前')constreq=context.switchToHttp().getRequest();console.log('请求对象',req)returnnext.handle().pipe(map((data)=>{console.log('拦截器执行之后')console.log('数据',data)returndata}));}}

注册拦截器

拦截器可以全局注册、模块注册或方法级注册:

全局注册

main.ts中使用SerializeInterceptor

app.useGlobalInterceptors(newSerializeInterceptor());
模块注册

通过模块的providers数组注册,并标记为可注入:

@Module({providers:[{provide:APP_INTERCEPTOR,useClass:SerializeInterceptor,},],})exportclassAppModule{}
方法级注册

直接在控制器方法上使用@UseInterceptors装饰器:

@Controller('users')exportclassUsersController{@UseInterceptors(SerializeInterceptor)@Get()findAll(){/* ... */}}

常见应用场景

统一响应格式

通过拦截器将控制器返回的数据包装为固定格式:

@Injectable()exportclassTransformInterceptorimplementsNestInterceptor{intercept(context:ExecutionContext,next:CallHandler):Observable<any>{returnnext.handle().pipe(map(data=>({success:true,data})));}}
性能监控

记录方法执行耗时:

@Injectable()exportclassTimingInterceptorimplementsNestInterceptor{intercept(context:ExecutionContext,next:CallHandler):Observable<any>{conststart=Date.now();returnnext.handle().pipe(tap(()=>console.log(`Execution time:${Date.now()-start}ms`)),);}}
缓存拦截

实现简单的缓存逻辑:

@Injectable()exportclassCacheInterceptorimplementsNestInterceptor{privatecache=newMap<string,any>();intercept(context:ExecutionContext,next:CallHandler):Observable<any>{constrequest=context.switchToHttp().getRequest();constkey=request.url;if(this.cache.has(key)){returnof(this.cache.get(key));}returnnext.handle().pipe(tap((data)=>this.cache.set(key,data)),);}}

高级用法

修改请求数据

通过拦截器预处理请求参数:

@Injectable()exportclassSanitizeInterceptorimplementsNestInterceptor{intercept(context:ExecutionContext,next:CallHandler):Observable<any>{constrequest=context.switchToHttp().getRequest();request.body=this.sanitize(request.body);returnnext.handle();}privatesanitize(data:any){// 实现数据清洗逻辑returndata;}}
异步拦截

结合rxjs操作符处理异步流:

@Injectable()exportclassTimeoutInterceptorimplementsNestInterceptor{intercept(context:ExecutionContext,next:CallHandler):Observable<any>{returnnext.handle().pipe(timeout(5000),// 5秒超时catchError((err)=>throwError(newRequestTimeoutException())),);}}

小栗子

实现请求敏感信息的过滤

import{CallHandler,ExecutionContext,Injectable,NestInterceptor}from'@nestjs/common';import{plainToInstance}from'class-transformer';import{map,Observable}from'rxjs';@Injectable()exportclassSerializeInterceptorimplementsNestInterceptor{constructor(privatedto?:any){}intercept(context:ExecutionContext,next:CallHandler):Observable<any>{console.log('拦截器执行之前')constreq=context.switchToHttp().getRequest();console.log('请求对象',req)returnnext.handle().pipe(map((data)=>{console.log('拦截器执行之后')console.log('数据',data)returnplainToInstance(this.dto,data,{// Expose 设置暴露字段// Exclude 设置排除字段excludeExtraneousValues:true,// 设置为true之后,所有经过拦截器的接口都需要设置Expose或者Exclude})}));}}

拦截器与过滤器的区别

  • 拦截器:作用于方法调用前后,可修改请求/响应数据流。
  • 异常过滤器:仅捕获异常,无法修改正常流程的数据。

最佳实践

  • 避免在拦截器中实现业务逻辑,保持职责单一。
  • 优先使用模块注册而非全局注册,便于测试和依赖管理。
  • 对于性能敏感的拦截器,可通过缓存减少重复计算。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:23:27

32、深入探索vi编辑器:参数配置与命令缩写技巧

深入探索vi编辑器:参数配置与命令缩写技巧 在UNIX系统中,vi编辑器是一款功能强大且广泛使用的工具。它提供了丰富的配置选项和灵活的命令缩写功能,能够极大地提高编辑效率。本文将详细介绍vi编辑器的参数配置和命令缩写的相关知识和操作方法。 1. 配置vi参数 vi编辑器拥有…

作者头像 李华
网站建设 2026/6/10 11:16:20

46、UNIX相关知识与组织介绍

UNIX相关知识与组织介绍 1. 推荐组织 在UNIX相关领域,有许多专业组织发挥着重要作用,以下是一些推荐的组织: | 组织名称 | 简介 | 官网 | | ---- | ---- | ---- | | ACM | 世界上历史最悠久、规模最大的教育和科学计算协会。自1947年以来,ACM为信息、思想和发现的交流…

作者头像 李华
网站建设 2026/6/9 7:48:47

buuctf中的ciscn_2019_en_2

首先checksec检查保护机制&#xff1a;-64位程序-开启了栈不可执行保护接下来使用IDA反汇编工具进行分析&#xff1a;发现begin函数&#xff0c;点进去begin函数内部&#xff1a;输入1可用进入encrypt函数&#xff0c;输入2可从主函数看到并没有什么用&#xff0c;3是退出程序这…

作者头像 李华
网站建设 2026/6/10 11:21:52

Kotaemon面试模拟机器人:AI考官训练求职者

Kotaemon面试模拟机器人&#xff1a;AI考官训练求职者 在招聘旺季&#xff0c;一家科技公司HR每天要筛选上百份简历&#xff0c;安排初面、评估候选人表达能力与逻辑思维。传统流程中&#xff0c;每位候选人的初步沟通至少耗时30分钟&#xff0c;而面试官的主观判断差异又常常导…

作者头像 李华
网站建设 2026/6/10 11:21:04

约翰·伯格的长期投资回报预期管理

约翰伯格的长期投资回报预期管理 关键词:约翰伯格、长期投资、回报预期管理、投资理念、指数基金 摘要:本文围绕约翰伯格的长期投资回报预期管理展开深入探讨。首先介绍了约翰伯格及其投资理念的背景,阐述了长期投资回报预期管理的重要性。接着分析了核心概念及相互联系,通…

作者头像 李华
网站建设 2026/6/9 18:31:41

Kotaemon边缘计算部署:Jetson设备运行可行性验证

Kotaemon边缘计算部署&#xff1a;Jetson设备运行可行性验证 在智能制造车间的一台数控机床前&#xff0c;工程师对着语音助手提问&#xff1a;“E-203设备连续报警过热&#xff0c;该怎么处理&#xff1f;”不到两秒&#xff0c;系统便返回了结构化建议&#xff1a;“请立即停…

作者头像 李华