NestJs 在所有路由上使用中间件

NestJs using middleware on all routes

我是 nestjs 的新手,我正在使用中间件来验证我的用户。我想将其应用于所有路线。我目前正在一个接一个地添加控制器,它变得多余了。

export class AppModule implements NestModule {
  public configure(consumer: MiddlewareConsumer): void {
    consumer.apply(GetUserMiddleware).forRoutes(
      UserController,
      //***
    );
  }
}

我浏览了文档但找不到它 (NestJs - Middleware)。

我如何更改它以使我的中间件在所有路由上工作?

import { RequestMethod } from '@nestjs/common';
// ...
      .forRoutes({
        path: '*',
        method: RequestMethod.ALL,
      });

第一种方法:
如果你想在每条路线上使用你的中间件,你可以使用全局中间件。

const app = await NestFactory.create(AppModule);
app.use(yourMiddlewareMethod);
await app.listen(3000);

注意:虽然这适用于每条路线,但用户将无法登录。在这种情况下,您可以通过在 app.module.ts 中排除它来覆盖用户模块上中间件的使用,例如

consumer
  .apply(yourMiddlewareMethod)
  .exclude(
    { path: 'yourPath', method: RequestMethod.GET },
    { path: 'yourPath', method: RequestMethod.POST },
    'yourPath/(.*)',
  )
  .forRoutes(yourController);

第二种方法:
app.module.ts 中:

...
    export class AppModule implements NestModule {
      configure(consumer: MiddlewareConsumer) {
        consumer
          .apply(yourMiddlewareMethod)
          .forRoutes(yourController);
      }
    }

希望这能回答您的问题。

只需在路线中使用 '*'

export class AppModule implements NestModule {
  public configure(consumer: MiddlewareConsumer): void {
    consumer.apply(GetUserMiddleware).forRoutes('*');
  }
}