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

时间:2019-05-21 13:48:01

标签: javascript node.js typescript express nestjs

我正在尝试在NestJS应用中使用斗牛竞技场。

Promise

这行得通!

但是由于从数据库加载队列,我需要对$.ajax({ url: 'url1', success: function() { console.log('URL1 call success'); $.ajax({ url: 'url2', success: function() { console.log('URL2 call success'); }, error:function() { console.log('URL2 call error'); } }) }, error: function() { console.log('URL1 call error'); $.ajax({ url: 'url3', success: function() { console.log('URL3 call success'); }, error:function() { console.log('URL3 call error'); } }) }}) 使用async / await。

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()之类的东西?

处理此问题的最简单方法是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', }, ]; } } 配置支持,但未实现。

1 个答案:

答案 0 :(得分:0)

您可以为异步创建的arenaQueues创建一个custom provider

将自定义提供程序添加到您的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');
  }