Nestjs如何使用异步/等待中的中间件配置中间件



我正在尝试在Nestjs应用中使用Bull-Arena。

export class AppModule {
  configure(consumer: MiddlewareConsumer) {
    const queues = this.createArenaQueues();
    const arena = Arena({ queues }, { disableListen: true });
    consumer.apply(arena).forRoutes('/system/queues');
  }
  createArenaQueues() {
    return [
      {
        name: 'Notification_Emailer',
        hostId: 'MyAwesomeQueues',
        url: 'redis://localhost',
      },
    ];
}
}

这有效!

,但由于从db中加载队列,我需要使用异步/等待createArenaQueues()

export class AppModule {
  configure(consumer: MiddlewareConsumer) {
    const queues = await this.createArenaQueues();   //await here
    const arena = Arena({ queues }, { disableListen: true });
    consumer.apply(arena).forRoutes('/system/queues');
  }
  async createArenaQueues() {                       // async here
    return [
      {
        name: 'Notification_Emailer',
        hostId: 'MyAwesomeQueues',
        url: 'redis://localhost',
      },
    ];
  }
}

不起作用!

那么,问题,如何处理?

从"系统"控制器中运行竞技场很酷,但我无法找到一种方法。

另外,我试图将竞技场移至独立的中间件,但不知道,最终我该怎么办:返回诸如res.send(arena)或什么?

之类的东西?

最简单的处理方法是async配置支持,但未实现。

您可以为您的arenaQueues创建一个自定义提供商,该提供商是异步创建的:

将自定义提供商添加到您的AppModule的提供商:

providers: [
  ArenaService,
  {
    provide: 'arenaQueues',
    useFactory: async (arenaService: ArenaService) => arenaService.createArenaQueues(),
    inject: [ArenaService],
  },
],

然后将arenaQueues注入您的AppModule

export class AppModule {
  constructor(@Inject('arenaQueues') private queues) {}
  configure(consumer: MiddlewareConsumer) {
    // Now, you can use the asynchronously created this.queues here
    const arena = Arena({ queues: this.queues }, { disableListen: true });
    consumer.apply(arena).forRoutes('/system/queues');
  }

最新更新