写一个中间件(middleware),在需要模块中注入
可全局注入 app.use 可在模块中单独加入,根据路由编写exclue和forRoutes
class middleware
import { Injectable, NestMiddleware, Request, Response } from "@nestjs/common"
// import { Request, Response } from "express"
// 如果Request Response 是从express中引入的类型 post请求要获取请求体需要配合 body-parser
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Resopnse, next: () => void) {
console.log("log middleware")
next();
}
}
module apply middleware
import { Module, NestModule, MiddlewareConsumer } from "@nestjs/common"
import { LoggerMiddleware } from "./common/middleware/logger.middleware"
import { CatsModule } from "./cats/cats.module"
@Module({
imports: [CatsModule]
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.exclude( // 排除哪些路由
{ path: "cats", method: RequestMethod.GET },
{ path: "cats", method: RequestMethod.POST }
)
// .forRoutes("cats") // 匹配哪些路由
// .forRoutes({ path: "cats", method: RequesMethod.Get }) // path 可以通配符
// .forRoutes(CatsController)
}
}
function middleware
import { Request, Reponse } from "nestjs/common"
import { Request, Reponse } from "express"
export function logger (
req: Request,
res: Response,
next: Function
) {
console.log("logger")
next()
}
app.module
consumer
.apply(logger) // 多个中间件可使用逗号隔开
.forRoutes(CatsController);
multiple middleware
consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
global middleware
main.ts中使用app.use()
app.use(logger)