中间件
原创...大约 2 分钟
中间件是一个称为 before
路由处理程序的函数。 中间件函数可以访问 request
和 response
对象,以及应用请求-响应周期中的 next()
中间件函数。 next 中间件函数通常由名为 next 的变量表示。
默认情况下,Nest 中间件等同于 express 中间件。 官方 express 文档中的以下描述描述了中间件的功能
中间件函数可以执行以下任务
- 执行任何代码。
- 更改请求和响应对象。
- 结束请求-响应循环。
- 调用堆栈中的下一个中间件函数。
- 如果当前中间件函数没有结束请求-响应循环,它必须调用 next() 将控制权传递给下一个中间件函数。 否则,请求将被挂起。
现在我们创建一个logger
中间件
nest g mi ./middleware/logger
我们看到在src/middleware
目录下
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
next();
}
}
简单修改
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('Request...');
next();
}
}
Nest 中间件完全支持依赖注入。 就像提供者和控制器一样,他们能够在同一模块中使用 注入依赖。 像往常一样,这是通过 constructor
完成的。
应用中间件
@Module()
装饰器中没有中间件的位置。 相反,我们使用模块类的 configure()
方法设置它们。 包含中间件的模块必须实现 NestModule
接口。 让我们在 AppModule
级别设置 LoggerMiddleware
。
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from 'src/middleware/logger/logger.middleware';
import { UserModule } from './modules/user/user.module';
@Module({
imports: [CatsModule],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('user');
}
}
现在我们每次访问user模块下的路由地址http://localhost:3000/user
,都会在控制台打印Request...
或者也可以具体到某一个请求方法
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes({ path: 'user', method: RequestMethod.GET });
}
}
全局中间件
如果我们想一次将中间件绑定到每个已注册的路由,我们可以使用 INestApplication
实例提供的 use()
方法:
const app = await NestFactory.create(AppModule);
app.use(LoggerMiddleware);
await app.listen(3000);
Powered by Waline v2.15.7