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');
}
