中间件是一个称为 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
全局 main.ts
import { Request,Response,NextFunction } from 'express'
function middlewareFunc(req:Request,res:Response,next:NextFunction){
console.log("全局中间件")
next()
}
app.use(middlewareFunc)