NestJS Как настроить промежуточное ПО с помощью async/await?

Я пытаюсь использовать бычью арену в приложении NestJS.

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

Это работает!

Но мне нужно использовать async/await для 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 настроить поддержку, но она не реализована.

🤔 А знаете ли вы, что...
JavaScript поддерживает модульную структуру, что способствует организации кода на больших проектах.


2
1 954
1

Ответ:

Решено

Вы можете создать пользовательский поставщик для своего 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');
  }