繁体   English   中英

NestJS如何使用async / await配置中间件?

[英]NestJS How to configure middleware with async/await?

我正在尝试在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',
      },
    ];
}
}

这可行!

但是由于从db加载队列,我需要对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',
      },
    ];
  }
}

不起作用!

那么,问题是如何处理呢?

从“系统”控制器运行竞技场是很酷的事情,但我想不出办法。

另外,我尝试将竞技场移至独立的中间件,但不知道我最终应该做些什么:返回诸如res.send(arena)东西?

解决此问题的最简单方法是async配置支持,但未实现。

您可以为arenaQueues创建一个自定义提供程序 ,该提供程序是异步创建的:

将自定义提供程序添加到您的AppModule的提供程序中:

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

然后将arenaQueues注入您的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');
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM