Socket.IO消息发送成功仍抛出超时错误的原因排查
问题原因及解决办法
你遇到的超时错误是因为Socket.IO的事件确认机制没被正确处理:
- 服务端调用
emit("msg-received")时传入了最后一个回调函数,这是在要求客户端收到事件后必须返回确认响应,服务端会等待这个响应,超时没收到就会抛出你看到的错误。 - 但你的客户端代码只监听了
msg-received事件并处理了msg参数,完全没处理服务端要求的确认回调。
解决办法
方法1:客户端返回确认(保留服务端的确认逻辑)
修改客户端的事件监听代码,加上确认回调参数并调用:
socket.current.on("msg-received", (msg, ack) => { set_re_msg(msg); // 调用确认回调,告知服务端已收到消息 ack(); });
如果需要给服务端返回额外数据,也可以在ack()里传参,比如ack("收到消息"),服务端的回调就能拿到这个值。
方法2:移除服务端的确认要求(不需要确认时用)
如果不需要确认客户端是否收到消息,直接删掉服务端emit的最后一个回调函数即可:
socket .to(SOCKET_ID_DIR[hit]?.[receiver]) .emit("msg-received", msg); // 去掉后面的(err, res) => {...}回调
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

