Pesquisa de site

javascript - NestJS Como configurar middleware com async/await?


Estou tentando usar bull-arena em um aplicativo 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',
      },
    ];
}
}

Isso funciona!

Mas eu preciso usar async/await para createArenaQueues(), devido ao carregamento das filas do banco de dados.

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

Não funciona!

Então, a pergunta, como lidar com isso?

Seria legal executar a arena a partir do controlador "System", mas eu não consegui descobrir uma maneira de fazer isso.

Além disso, tentei mover a arena para um middleware independente, mas não sei o que devo fazer no final: retornar algo como res.send(arena) ou o quê?

A maneira mais fácil de lidar com isso é async configurar suporte, mas não está implementado.

Resposta #1

Você pode criar um provedor personalizado para seu arenaQueues que é criado de forma assíncrona:

Adicione o provedor personalizado aos providers do seu AppModule:

providers: [
  ArenaService,
  {
    provide: 'arenaQueues',
    useFactory: async (arenaService: ArenaService) => arenaService.createArenaQueues(),
    inject: [ArenaService],
  },
],

e então injete o arenaQueues no seu 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');
  }