【问题标题】:NestJS ClientRedis emits but EventPattern handler not triggeredNestJS ClientRedis 发出但未触发 EventPattern 处理程序
【发布时间】:2021-09-16 15:51:33
【问题描述】:

我正在运行 @nestjs 7.6.18。我按照how to wire up Redis 上的说明发出和接收事件。我附上了最小的复制品,所以你可以自己运行它。这是设置:

main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  await NestFactory.createMicroservice<RedisOptions>(AppModule, {
    transport: Transport.REDIS,
    options: { url: 'redis://localhost:6379' },
  });
  await app.listen(3000);
}
bootstrap();

应用模块

@Module({
  imports: [TransportModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

应用控制器

  @EventPattern(EVENT_NAME) // <- EVENT_NAME is string constant 'EVENT_NAME'
  onEvent(data: any) {
    Logger.log('Event received'); // <- this is never executed
    Logger.log(data);
  }

传输模块

export const EVENT_NAME = 'EVENT_NAME';
export const NEST_REDIS = Symbol('NEST_REDIS');

export const RedisProvider: Provider = {
  provide: NEST_REDIS,
  useFactory: () =>
    ClientProxyFactory.create({
      transport: Transport.REDIS,
      options: { url: 'redis://localhost:6379' },
    }),
};

@Module({ providers: [RedisProvider] })
export class TransportModule implements OnApplicationBootstrap {
  constructor(@Inject(NEST_REDIS) private client: ClientRedis) {}

  onApplicationBootstrap() {
    this.client.connect().then(() => {
      Logger.log('REDIS is connected');
      this.startEmitting();
    });
  }

  startEmitting() {
    let msgNumber = 0;

    // wait 3 secs, then start emitting every 8
    timer(3000, 8000)
      .pipe(
        tap(() => Logger.log(`Emitting message #${++msgNumber}`)),
        tap(() => this.client.emit(EVENT_NAME, { messageNumber: msgNumber })),
      )
      .subscribe();
  }
}

当我运行它时,消息会正确发出,但永远不会触发 AppController.onEvent 处理程序

我的 Redis 是 6.2.4,从 Windows 上的 Linux shell 运行。该应用程序正在 Windows 上正确运行。这是应用程序日志:

这是我在订阅流时在redis-cli 中看到的内容。我认为 cli 是唯一的订阅者(即 NestJS 没有在频道上监听),因为返回的是整数 1:

这里是 repo,如果你想运行它(npm run install 然后npm run startSource code

【问题讨论】:

    标签: typescript redis nestjs windows-subsystem-for-linux


    【解决方案1】:

    NestJS 没有监听 Redis 频道,因为在创建微服务后,我从未启动它。在main.ts 我不得不改变:

    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
    
      await NestFactory.createMicroservice<RedisOptions>(AppModule, {
        transport: Transport.REDIS,
        options: { url: 'redis://localhost:6379' },
      });
      await app.listen(3000);
    }
    

    收件人:

    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
    
      redisMicroservice = await NestFactory.createMicroservice<RedisOptions>(AppModule, {
        transport: Transport.REDIS,
        options: { url: 'redis://localhost:6379' },
      });
    
      redisMicroservice.listenAsync(); // <- new line
      await app.listen(3000);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 2013-02-22
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多