推荐答案
在 Nest.js 中,可以通过以下步骤在路由中应用中间件:
创建中间件:首先,使用
@nestjs/common中的MiddlewareConsumer和NestMiddleware接口来创建自定义中间件。注册中间件:在模块中使用
MiddlewareConsumer的apply方法来注册中间件,并通过forRoutes方法指定应用中间件的路由。应用中间件:在
configure方法中配置中间件,使其在特定路由上生效。
本题详细解读
1. 创建中间件
首先,创建一个自定义中间件类。这个类需要实现 NestMiddleware 接口,并实现 use 方法。
// www.javascriptcn.com code example
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();
}
}2. 注册中间件
在模块中,使用 MiddlewareConsumer 来注册中间件。MiddlewareConsumer 提供了 apply 方法来指定中间件,并通过 forRoutes 方法指定应用中间件的路由。
// www.javascriptcn.com code example
import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
import { CatsController } from './cats/cats.controller';
@Module({
controllers: [CatsController],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('cats');
}
}3. 应用中间件
在上面的代码中,LoggerMiddleware 被应用到了 CatsController 的所有路由上。你也可以通过传递控制器类来指定更具体的路由。
consumer .apply(LoggerMiddleware) .forRoutes(CatsController);
4. 排除特定路由
如果你希望在应用中间件时排除某些路由,可以使用 exclude 方法。
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST },
)
.forRoutes(CatsController);5. 全局中间件
如果你希望中间件在所有路由上生效,可以在 main.ts 中使用 app.use 方法。
// www.javascriptcn.com code example
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { LoggerMiddleware } from './logger.middleware';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(LoggerMiddleware);
await app.listen(3000);
}
bootstrap();通过以上步骤,你可以在 Nest.js 中灵活地应用中间件到特定的路由或全局范围内。