【发布时间】: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 start)
Source code
【问题讨论】:
标签: typescript redis nestjs windows-subsystem-for-linux