alexsis
alexsis

Reputation: 23

NestJS How to configure middleware with async/await?

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

Answers (1)

Kim Kern
Kim Kern

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

Related Questions