NestJS核心成员组成-中间件

关于MiddleWare

从本质来说,我们使用NestJS的时候,有百分之九十的原因是我们只想要一个能提供API的服务,即便是一个简单的由数据库+https请求的后台,也能满足百分之九十的人了。

对于有Express以及Koa开发的朋友来说,中间件的概念无需多讲,因为NodeJS对http请求的处理就是一个洋葱图,所以我们中间件就可以实现对很多请求的拦截以及处理,这也是中间件能成为核心概念的一大原因。

创建MiddleWare

在NestJS中,使用中间件不需要安装额外的包,当我们使用了nest/cli创建一个NestJS项目之后,只需要在控制台输入如下指令,脚手架会自动帮你创建一个基本的中间件。

nest g middleware middlewares/logger 上述指令,意思是在middlewares文件夹中,创建一个名字为logger的中间件,顾名思义,这个中间件是用来打印一些东西的。 在文件内的地址如下,同时也创建了test的文件,但是这个无关紧要。

生成的代码如下:

javascript 复制代码
import { Injectable, NestMiddleware } from '@nestjs/common';
​
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    next();
  }
}

其中,第五行开始的方法就是我们要编写的地方,而传入的三个参数中,req表示请求体,res表示返回体,next则需要在最后的时候调用,这样子程序才不会在这儿卡住。

接下来,在代码中简单的打印出一句话

javascript 复制代码
 console.log('在LoggerMiddleware中打印了日志。');

一个最简单的中间件就创建好了,接下来要做的就是配置中间件。

配置MiddleWare

首先,我们要知道我们创建的中间件的对象,比如你是要监听a模块的时候,你需要将该中间件添加到a模块中,而不是添加到app的module中,由于本demo只有app.module文件。所以我们要在app.module抛出的时候,将其处理下

javascript 复制代码
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开头的,则不会进入到我们的中间件中。

如果多个中间件,我们需要这么配置

javascript 复制代码
consumer
      .apply(LoggerMiddleware)
      .exclude('article/(.*)')
      .forRoutes('*')
      .apply(LoggerMiddleware)
      .exclude('article/(.*)')
      .forRoutes('*');

对于http请求的拦截以及处理,MiddleWare的对比守卫还有一个好处,就是处理token的时候,可以用Exclude对登陆模块可以做出排除,而使用守卫则需要在代码中手动排除。

公众号文章

一个分享开发知识的公众号,求大佬们关注~

相关推荐
今夜星辉灿烂12 小时前
nestjs微服务-系列5
后端·nestjs
一生躺平的仔4 天前
NestJS Swagger 使用说明文档
nestjs
plusone5 天前
【Nest指北系列-源码】(七)请求生命周期
nestjs
小山不高6 天前
nest中如何对typeorm 的repo设置总的center
nestjs
bug_marker19 天前
BullMq sleep job是否会阻塞worker中的其他的jobs
nestjs
濮水大叔25 天前
快来玩玩便捷、高效的Demo练习场
typescript·nodejs·nestjs
木西25 天前
Nest.js实战:构建聊天室的群聊与私聊模块
前端·后端·nestjs
LannyChung1 个月前
NestJS定时器之@Cron
nestjs
None3211 个月前
【NestJs】集成Prisma数据库配置
nestjs