【Nest全栈之旅】第六章:拦截器知多少?🙅🏻‍♀️🙅🏻‍♀️🙅🏻‍♀️

前言

顾名思义,拦截器可以在执行应用程序之前或之后插入额外的逻辑,拦截器是AOP编程思想的体现,它可以做以下事情:

  • 在方法执行之前/之后绑定额外的逻辑
  • 转换函数返回的结果
  • 转换函数抛出的异常
  • 扩展基本功能行为
  • 根据特定条件完全覆盖函数(例如,出于缓存目的)

Nest中的拦截器

Nest中,拦截器需要实现NestInterceptor类的intercept方法,它接受两个参数,一个是拦截器执行上下文ExecutionContext,它里面添加了一些方法用于获取更多关于拦截器的详细信息,如获取当前是由哪个或者方法调用拦截器;第二个参数是CallHandler,也叫应用处理程序,例如在controller中的路由处理方法findOne,我们来验证一下上面两点:

这里我自定义一个耗时统计拦截器(后面再讲),用于拦截PersonController这个控制器,它会拦截这里的所有方法,通过ExecutionContext获取拦截器装饰的方法

TimeoutInterceptor里面会统计方法耗时并且打印是哪个路由方法触发了拦截器

在前端先后发送两个请求调用接口

来看看结果

当然,我们也可以知道是哪个类绑定了拦截器,通过getClass方法获取

所以,由此我们可以知道拦截器可以绑定一个控制器作用域、方法作用域,其实还有一个就是全局作用域,即在全局绑定的拦截器,是应用到所有的路由方法中,比如全局绑定响应拦截器,那么就可以统一返回前端的数据结构:

自定义拦截器

这里我们自定义了一个统计方法耗时的拦截器

从上面的自定义拦截器中,我们可以看到通过返回next.handle()可以让路由处理方法可以继续执行,同时这里涉及到一系列方式对数据进行操作,如taptimeoutmapfilter等,它们来自Rxjs库。

Rxjs是一个组织异步的库,它里面有很多操作方法,使用它可以很方便来操作一些逻辑,角色譬如lodash

有人会说,这些方法自己都可以实现啦,的确是的,但是不得不说Rxjs里面提供了太多的方法,用的越多效率越高。

那这样会不会提高心智负担呢?答案是基本上不会,因为实际上常用到的方法也就那么几个,如tapmaptimeoutcatchErrorfilter这几个。

总结

拦截器需要实现NestInterceptor类的intercept方法,而在Nest中,可以便利的使用Rxjs里面的操作方法来实现自定义拦截器功能。

拦截器是有控制范围的,它可以在控制器作用域、方法作用域和全局作用域中使用拦截器,控制器作用域只能控制某个拦截器里面的路由处理函数,而全局拦截器可以拦截所有控制器的路由处理函数,例如异常拦截器响应拦截器会挂在全局进行统一控制。

相关推荐
天才熊猫君2 分钟前
配置与数据分离:一种可视化搭建的属性编辑方案
前端·javascript
Ai拆代码的曹操12 分钟前
从一条转账 SQL 到分布式事务:5 种方案的全方位对比与实战
后端
林希_Rachel_傻希希12 分钟前
web性能之相关路径——AI总结
前端·javascript·面试
掘金小豆13 分钟前
Spring 事务失效的 6 大场景,你踩过几个?
后端·spring·面试
im_lanny19 分钟前
Agent = Model + Harness:决定 AI 智能体上限的,往往不是模型而是“装具”
后端
竹林81820 分钟前
用 wagmi v2 踩坑两天,我终于搞懂了多链钱包切换在 DeFi 前端中的正确姿势
前端·javascript
阿文和她的Key20 分钟前
AI新词太多?把它们串成一条线就清楚了
后端
用户21366100357222 分钟前
Vue项目搜索功能与面包屑导航
前端·javascript
星栈26 分钟前
LiveView 的实时通信,爽是爽,但 PubSub 和广播也最容易把自己绕晕
前端·前端框架·elixir
用户29307509766927 分钟前
告别关键词匹配,拥抱向量语义 —— RAG 搜索从零到一
前端