关于MiddleWare
从本质来说,我们使用NestJS的时候,有百分之九十的原因是我们只想要一个能提供API的服务,即便是一个简单的由数据库+https请求的后台,也能满足百分之九十的人了。
对于有Express以及Koa开发的朋友来说,中间件的概念无需多讲,因为NodeJS对http请求的处理就是一个洋葱图,所以我们中间件就可以实现对很多请求的拦截以及处理,这也是中间件能成为核心概念的一大原因。
创建MiddleWare
在NestJS中,使用中间件不需要安装额外的包,当我们使用了nest/cli创建一个NestJS项目之后,只需要在控制台输入如下指令,脚手架会自动帮你创建一个基本的中间件。
nest g middleware middlewares/logger
上述指令,意思是在middlewares文件夹中,创建一个名字为logger的中间件,顾名思义,这个中间件是用来打印一些东西的。
在文件内的地址如下,同时也创建了test的文件,但是这个无关紧要。
生成的代码如下:
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
next();
}
}
其中,第五行开始的方法就是我们要编写的地方,而传入的三个参数中,req表示请求体,res表示返回体,next则需要在最后的时候调用,这样子程序才不会在这儿卡住。
接下来,在代码中简单的打印出一句话
console.log('在LoggerMiddleware中打印了日志。');
一个最简单的中间件就创建好了,接下来要做的就是配置中间件。
配置MiddleWare
首先,我们要知道我们创建的中间件的对象,比如你是要监听a模块的时候,你需要将该中间件添加到a模块中,而不是添加到app的module中,由于本demo只有app.module文件。所以我们要在app.module抛出的时候,将其处理下
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('*');
}
}
其中,在configure方法中,我们用apply引入了中间件LoggerMiddleware,且确定了他的使用范围。
在forRoutes中,我们一般会传入类似“user"之类的具体参数表示监听哪个控制类,”*“代表的是监听所有的控制类
如果是要排除某个控制器,比如要排除user的时候,我们会这么写
consumer.apply(LoggerMiddleware).exclude(‘article/(.)‘).forRoutes(’’);
该方式表示如果是以article开头的,则不会进入到我们的中间件中。
如果多个中间件,我们需要这么配置
consumer
.apply(LoggerMiddleware)
.exclude('article/(.*)')
.forRoutes('*')
.apply(LoggerMiddleware)
.exclude('article/(.*)')
.forRoutes('*');
对于http请求的拦截以及处理,MiddleWare的对比守卫还有一个好处,就是处理token的时候,可以用Exclude对登陆模块可以做出排除,而使用守卫则需要在代码中手动排除。
公众号文章
一个分享开发知识的公众号,求大佬们关注~