Nestjs 中服务和网关之间的 eventEmitter 通信问题

问题描述 投票:0回答:1

目前我正在处理我的项目并遇到了一个特定问题。我不明白为什么 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 仅适用于提供程序,也许这就是它不起作用的原因。

websocket service nestjs gateway eventemitter
1个回答
0
投票

我找到了解决我的问题的可行解决方案: 在

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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.