NestJS 中间件

70 阅读1分钟

中间件是一个称为 before 路由处理程序的函数。 中间件函数可以访问 request 和 response 对象,以及应用请求-响应周期中的 next() 中间件函数。 next 中间件函数通常由名为 next 的变量表示。

默认情况下,Nest 中间件等同于 express 中间件。 官方 express 文档中的以下描述描述了中间件的功能:

中间件函数可以执行以下任务:

  • 执行任何代码。
  • 更改请求和响应对象。
  • 结束请求-响应循环。
  • 调用堆栈中的下一个中间件函数。
  • 如果当前中间件函数没有结束请求-响应循环,它必须调用 next() 将控制权传递给下一个中间件函数。 否则,请求将被挂起。

你可以在函数中或在具有 @Injectable() 装饰器的类中实现自定义 Nest 中间件。 类应实现 NestMiddleware 接口,功能无特殊要求。 让我们从使用类方法实现一个简单的中间件函数开始

局部

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request,Response,NextFunction } from 'express'

@Injectable()
export class MiddlewareMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log("demo middleware")
    next();
  }
}

demo.module.ts

import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common';
import { DemoService } from './demo.service';
import { DemoController } from './demo.controller';
import  { MiddlewareMiddleware } from './../middleware/index'

@Module({
  controllers: [DemoController],
  providers: [DemoService],
  exports:[DemoService]
})
export class DemoModule implements NestModule{
  configure(consumer: MiddlewareConsumer) {
      consumer.apply(MiddlewareMiddleware).forRoutes('demo')
  }
}

apply() 方法可以采用单个中间件或多个参数来指定 多个中间件

forRoutes() 参数

  • { path: string, method: RequestMethod }
  • string 路由
  • controller

image.png

全局 main.ts

import { Request,Response,NextFunction } from 'express'
function middlewareFunc(req:Request,res:Response,next:NextFunction){
  console.log("全局中间件")
  next()
}
app.use(middlewareFunc)

image.png