目前我正在处理我的项目并遇到了一个特定问题。我不明白为什么 eventEmitter 在服务和网关之间不起作用。这是一个代码示例:
// chat.service.ts
async test(payload: object) {
this.eventEmitter.emit('chat.test', payload);
return {
test: true
}
}
// chat.gateway.ts
@OnEvent('chat.test')
async handleTest(payload: object) {
socket.emit('test', payload)
}
套接字正在工作,eventEmitter 在服务之间工作正常,但在服务和网关之间不起作用。
关于需求:我有一种情况,另一个服务通过 eventEmitter 触发器创建聊天,并且我需要立即为用户加载新创建的聊天。
我将不胜感激任何帮助或建议。也许还有另一种解决方案可以实现这一目标?始终开放讨论。
我在某处读到 eventEmitter 仅适用于提供程序,也许这就是它不起作用的原因。
我找到了解决我的问题的可行解决方案: 在
chat.service.ts
文件中,必须在具有公共访问权限的类的构造函数之外初始化 eventEmitter
。接下来,为了确保事件处理程序正常运行,可以采用以下方法:
// chat.service.ts
import { EventEmitter2 } from 'eventemitter2';
export class TestService {
eventEmitter: EventEmitter2 = new EventEmitter2();
async test(payload: object) {
this.eventEmitter.emit('chat.test', payload);
return {
test: true
};
}
}
在
chat.gateway.ts
文件中,应在构造函数中连接事件处理函数,如下所示:
// chat.gateway.ts
import { Injectable } from '@nestjs/common';
import { OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { TestService } from './chat.service';
@Injectable()
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
constructor(private readonly chatService: TestService) {
this.chatService.eventEmitter.on('chat.test', response => {
this.handleTest(response);
});
}
async handleTest(payload: object) {
socket.emit('test', payload);
}
}