如何在 Nestjs 中使用特定于路由的 express 中间件?

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

我正在尝试使用此库 (keycloak-connect) 进行身份验证和授权。它有一个全局中间件,可以通过 app.use() 方法直接使用,也可以通过在其周围包装一个 nestjs 中间件类来使用。但是如何使用路由特定的express中间件来保护各个路由呢?

plain express 应用中的示例用法

app.get( '/protected', keycloak.protect('adminRole'), handler );

保护方法returns 带有签名的普通 express 中间件 function(req, res, next)

你的 "handler" 是一个方法(用 GETPOST 等修饰)在用 @Controller 修饰的 class 中。 导入这个 controller 的模块应该声明中间件。

示例:

@Module({
  controllers: [YourController],
})
export class YourModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(keyCloack.protect('adminRole'))
      .forRoutes('/protected');
  }
}

其中 YourController 包含路由“/protected”的处理程序。

实施NestModule是关键。然后你有义务声明 configure 并且可以使用 consumer.

如果您只想将中间件应用于控制器中的路由,您可以 -

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