作者:markzzw 时间:2024-2-2
线上代码:CodeSandbox
Github:zhangzewei/nest-learning-tutorial
系列阅读
在 NestJS 开发中,中间件是一种强大的工具,用于处理请求和响应之间的逻辑。中间件允许我们在请求到达控制器之前或响应返回给客户端之前执行自定义的逻辑。它们可以用于处理身份验证、日志记录、错误处理等常见的任务,以及其他自定义的处理逻辑。
NestJS 提供了灵活且易于使用的中间件机制,使我们能够轻松地编写、注册和应用中间件。通过使用中间件,我们可以将一些通用的处理逻辑集中到一个地方,提高代码的可重用性和可维护性。
中间件函数可以执行以下任务:
- 执行任何代码。
- 对请求和响应对象进行更改。
- 结束请求-响应循环。
- 调用堆栈中的下一个中间件函数。
- 如果当前中间件函数不结束请求-响应循环,它必须调用next()将控制权传递给下一个中间件函数。否则,请求将被搁置。
创建中间件
log.middleware.ts
ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(req.path, 'log something');
next();
}
}
当然中间件也可以是函数式的:
ts
import { Request, Response, NextFunction } from 'express';
export function LoggerMiddleware(req: Request, res: Response, next: NextFunction) {
console.log(req.path, 'log something');
next();
};
使用中间件
ts
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatModule } from './cat/cat.module';
import { LoggerMiddleware } from './middleware/log.middleware';
@Module({
imports: [CatModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('/');
}
}
配置路由
在对应的 Module 的类里面实现 NestModule 的 configure 函数,在 configure 里使用传入的 consumer 参数调用 apply,把中间件放入 apply,然后使用 forRoutes 配置对应的路由。
ts
consumer
.apply(LoggerMiddleware)
.forRoutes({
path: 'cats',
method: RequestMethod.GET
});
也可以设置多个路由配置,path 的配置可以是单独的某一个路由,也可以是正则匹配的某一个类型的路由:
ts
consumer.apply(LoggerMiddleware).forRoutes(
{
path: 'app/*',
method: RequestMethod.GET,
},
{
path: 'cat',
method: RequestMethod.GET,
},
);
如果觉得写理由的配置比较麻烦,也可以直接将对应的 Controller 传入作为配置:
ts
consumer.apply(LoggerMiddleware).forRoutes(AppController);
全局使用
main.ts
ts
app.use(LoggerMiddleware);