javascript - NestJS 如何使用 async/await 配置中间件?
我正在尝试在 NestJS 应用中使用 bull-arena。
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',
},
];
}
}
这个有效!
但我需要对 createArenaQueues() 使用 async/await,因为需要从数据库加载队列。
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',
},
];
}
}
不起作用!
那么,问题是,如何处理这个?
从“System”控制器运行竞技场会很酷,但我找不到方法去实现它。
另外,我尝试将 arena 移动到独立的中间件,但不知道最后我应该做什么:返回类似 res.send(arena) 的东西还是其他?
处理这个最简单的方法是支持 async 配置,但它尚未实现。
答案#1
你可以为异步创建的 arenaQueues 创建一个自定义提供者:
将自定义提供者添加到你的 AppModule 的 providers 中:
providers: [
ArenaService,
{
provide: 'arenaQueues',
useFactory: async (arenaService: ArenaService) => arenaService.createArenaQueues(),
inject: [ArenaService],
},
],
然后在你的 AppModule 中注入 arenaQueues :
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');
}
