乐闻世界logo
搜索文章和话题

How to use a route specific middleware of express in Nestjs?

4 个月前提问
3 个月前修改
浏览次数50

1个答案

1

在NestJS中,您可以在模块、控制器或单个路由级别上使用Express中间件。NestJS本质上建立在Express之上(默认情况下,但也可以选择使用Fastify),因此可以直接使用Express中间件。以下是一些使用Express路由特定中间件的方法:

全局中间件

如果您想要在整个应用程序中使用中间件,可以在main.ts文件中全局注册它:

typescript
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import * as helmet from 'helmet'; // 一个用于安全的中间件 async function bootstrap() { const app = await NestFactory.create(AppModule); app.use(helmet()); // 全局使用helmet中间件 await app.listen(3000); } bootstrap();

模块级中间件

Module层面,您可以通过实现NestModule接口并在configure方法中配置中间件:

typescript
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common'; import { loggerMiddleware } from './logger.middleware'; @Module({ // ...其他配置项如controllers和providers }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer .apply(loggerMiddleware) .forRoutes('cats'); // 只对'cats'路由应用中间件 } }

控制器级中间件

如果您只想在特定控制器的路由中使用中间件,可以在控制器内的构造函数中配置:

typescript
import { Controller, Get, UseMiddleware } from '@nestjs/common'; @Controller('cats') export class CatsController { @Get() @UseMiddleware(loggerMiddleware) // 使用装饰器应用中间件 findAll() { // ...路由的处理逻辑 } }

请注意,@UseMiddleware 装饰器不是NestJS官方提供的API,这里仅为说明目的。在NestJS中,你可以使用@UseGuards, @UseInterceptors, @UsePipes, 和 @UseFilters。对于中间件,通常在Module级别使用configure方法注册,但如果需要直接在路由处理程序中使用Express中间件,你可以使用以下方式:

typescript
import { Controller, Get, Req, Res, Next } from '@nestjs/common'; import { Request, Response, NextFunction } from 'express'; @Controller('cats') export class CatsController { @Get() findCat(@Req() req: Request, @Res() res: Response, @Next() next: NextFunction) { loggerMiddleware(req, res, next); // ...之后会调用next(),然后继续路由的处理逻辑 } }

通过上面的方法,您可以根据需要在NestJS应用程序中的适当层次结构级别上使用Express路由特定中间件。这样做时,一定要考虑中间件的作用范围和执行顺序,确保您的应用程序的安全和效率。

2024年6月29日 12:07 回复

你的答案