Reputation: 23
I'm trying to use bull-arena in a NestJS app.
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',
},
];
}
}
This works!
But I need to use async/await for createArenaQueues()
, due to loading queues from db.
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',
},
];
}
}
Doesn't work!
So, the question, how to handle this?
It wold be cool to run arena from "System" controller, but I couldn't figure out a way to do it.
Also, I tried to move arena to standalone middleware, but dont know, what I should to do in the end: return something like res.send(arena)
or what?
Easiest way to handle this, is async
configure support, but it not implemented.
Upvotes: 2
Views: 3368
Reputation: 60357
You can create a custom provider for your arenaQueues
that is created asynchronously:
Add the custom provider to your AppModule
's providers:
providers: [
ArenaService,
{
provide: 'arenaQueues',
useFactory: async (arenaService: ArenaService) => arenaService.createArenaQueues(),
inject: [ArenaService],
},
],
and then inject the arenaQueues
in your 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');
}
Upvotes: 1