NestJS Как настроить промежуточное ПО с помощью async / await? - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь использовать bull-arena в приложении 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 настроить поддержку, но она не реализована.

1 Ответ

0 голосов
/ 21 мая 2019

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