从NestJS控制器或服务中发出WebSocket事件

8
我正在通过订阅器监听TypeORM中的模型更改事件,并在每次插入新事件时广播一个事件。虽然外部客户端可以接收到该事件,但网关的@SubscribeMessage()方法没有接收到它,这表明发送者没有接收到该事件。不过,根据socket.io的说法,of('namespace').emit('event')应该被任何客户端(包括发送者)接收到。
网关已经成功注入到订阅器服务中,当我尝试使用它时,网关的服务器似乎已准备就绪,但没有事件被发出。
运行在NestJS 6.3.1上,我还尝试从控制器中发出事件,但没有结果。
@WebSocketGateway({ namespace: '/posts' })
export class PostGateway {

  @WebSocketServer()
  server: Namespace;

  @SubscribeMessage('create')
  handleMessage(client: Socket, payload: Post): void {
    console.log('handling', payload);
  }

}

@Injectable()
export class PostSubscriber implements EntitySubscriberInterface<Post> {

  private socket: Namespace;

  constructor(
    @InjectConnection() readonly connection: Connection,
    private readonly gateway: PostGateway,
  ) {
    connection.subscribers.push(this);
    this.socket = gateway.server;
  }

  listenTo() {
    return Measurement;
  }

  afterInsert(event: InsertEvent<Post>): void {
    this.gateway.server.emit('create', event.entity);
  }

}


我对你的代码问题不太确定。不过,我发现在使用WebSockets时,在Chrome浏览器中的网络选项卡非常有帮助,你可以通过检查页面来进入该选项卡。如果你选择网络选项卡,然后选择WS作为通信类型,它应该会显示所有传入和传出的消息。希望这对你有所帮助。 - undefined
我最終注入了服務並使用 RxJS 的 Subject 來接收這些事件。 - undefined
由于这是服务之间的通信,无法轻易检查,但socket.io为相同目的提供了调试字符串。 - undefined
1个回答

0
我对你的代码问题不太确定。但是我可以给你一些建议,供你检查一下。
以下是一些建议:
1. 确保PostGateway已连接并且其服务器已正确初始化。
2. 检查命名空间连接。
```javascript if (!this.socket) { console.error('Socket is not initialized!'); } ```
3. 检查主模块中的Gateway初始化。
4. 调试发出的事件。
5. 检查客户端是否正确连接到指定的命名空间(/posts)并订阅'create'事件。
```javascript socket.on('create', (data) => { console.log('Received create event:', data); }); ```

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接