网站搜索

javascript - NestJS 如何使用 async/await 配置中间件?


我正在尝试在 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',
      },
    ];
}
}

这个有效!

但我需要对 createArenaQueues() 使用 async/await,因为需要从数据库加载队列。

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',
      },
    ];
  }
}

不起作用!

那么,问题是,如何处理这个?

从“System”控制器运行竞技场会很酷,但我找不到方法去实现它。

另外,我尝试将 arena 移动到独立的中间件,但不知道最后我应该做什么:返回类似 res.send(arena) 的东西还是其他?

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

答案#1

你可以为异步创建的 arenaQueues 创建一个自定义提供者:

将自定义提供者添加到你的 AppModule 的 providers 中:

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

然后在你的 AppModule 中注入 arenaQueues :

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');
  }