簡體   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