Я пытаюсь использовать бычью арену в приложении 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 поддерживает модульную структуру, что способствует организации кода на больших проектах.
Вы можете создать пользовательский поставщик для своего 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');
}