中间件的工作原理:
中间件是一个可插入请求处理流程的函数,通过在请求到达控制器之前或响应返回客户端之前进行拦截处理。
中间件可以在整个应用程序或特定路由范围内进行注册和使用。
通过使用 @Injectable() 装饰器将中间件类标记为可注入的,并使用 MiddlewareConsumer 提供的方法来应用或排除中间件。
创建中间件:
创建一个中间件类,实现 NestMiddleware 接口,并在 use() 方法中定义你的中间件逻辑。
import {
Injectable, NestMiddleware } from '@nestjs/common';
import {
Request, Response, NextFunction } from 'express';
@Injectable()
export class MyMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
// 中间件逻辑
console.log('Request...');
next();
}
}
注册中间件:
在根模块(通常是 app.module.ts)或其它模块中引导应用程序时,使用 configure() 方法来注册和配置中间件。
import {
MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import {
MyMiddleware } from './my.middleware';
import {
AppController } from './app.controller';
import {
AppService } from './app.service';
@Module({
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(MyMiddleware).forRoutes('*');
}
}
中间件的使用范围:
中间件可以应用于所有路由(*)或指定的路由。
通过传递一个或多个路由路径来限定中间件的使用范围。
consumer.apply(MyMiddleware).forRoutes('users', 'products');
//或
consumer.apply(MyMiddleware).forRoutes({
path: 'users', method: RequestMethod.GET });
异步中间件:
如果中间件需要进行异步操作,可以在 use() 方法中返回一个 Promise 或使用 async/await。
async use(req: Request, res: Response, next: NextFunction) {
await someAsyncOperation();
next();
}
通过使用NestJS的中间件拦截机制,你可以实现通用的处理逻辑、请求验证、日志记录等功能。中间件可以在请求到达控制器之前或响应返回客户端之前进行拦截和处理。这样可以更好地组织和重用代码,并提供可扩展和可定制的请求处理管道。