Socket.io 发出带有数据的事件将断开客户端并显示“解析错误”

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

我构建了一个 Socket.io 服务器来处理连接和事件:

import { createServer } from "http";
import { Server } from "socket.io";

const httpServer = createServer();
const io = new Server(httpServer);

io.on("connection", (socket) => {
    console.log('New connection');

    socket.on('join', data => {
        console.log(data);
    });
   ...
});

我正在尝试使用 npm 模块构建 Socker.io 客户端

socket.io-client

import { io } from 'socket.io-client';
const socket = io(servHost);

socket.on('connect', () => {
    console.log(`Connected : ${socket.id}`);
        
    socket.emit('join', "Some data");
    socket.emit('otherEvent');

  });

 socket.on('disconnect', (err) => {
    console.log(err);
    console.log("Disconnected");
});

服务器日志:

New connection
New connection
...

客户端日志:

Connected : IyR4Gr0Gvao16UD6AAAD
parse error
Disconnected
Connected : m8aSe6HI67i6VIBNAAAF
parse error
Disconnected
...

注意:如果我评论

socket.emit('join', "Some data");
一切正常,即使
otherEvent
被发出,客户端也可以处理预期的事件作为回报(代码中未显示)。所以我猜错误来自
join
事件内部的数据。

some data
可以是字符串/数组或对象(我尝试了一切)我有同样的错误。

我正在使用:

"socket.io": "^4.5.2",
"socket.io-client": "^4.5.2"
javascript node.js websocket socket.io
2个回答
1
投票

看起来

.emit()
期望对象作为第二个参数。

我有完全相同的问题,通过传递一个对象来解决:

socket.emit('join', {text: "Some data"});

0
投票

我一直在偶然发现这个问题,并认为这都是因为套接字io。

我已经尝试过:

  • 匹配客户端和服务器之间的套接字io版本(对我来说是4.6.1)
  • 尝试增加 maxHttpBufferSize
  • 增加 ping 超时

基本上,我已经尝试了基于此页面的几种解决方法:Socket IO 连接故障排除但仍然不起作用。

无论如何,我的初始代码如下所示:

const someDataNamespace = io.of('/socket/someData');

someDataNamespace.on('connection', async (socket) => {
  const userId = socket.handshake.query.userId;
  const deviceId = socket.handshake.query.deviceId;
  const organizationId = socket.handshake.query.organizationId;

  const someDatas = await findSomeDatas();

  // create room by userId
  socket.join(userId);
  // emit someDatas
  socket.emit(deviceId, someDatas);
  socket.emit(`${organizationId}-${userId}`, someDatas);

  // listen on event by deviceId
  socket.on(deviceId, async (payload) => {
    const someDatas = await findSomeDatas();
    socket.emit(deviceId, someDatas);
  });

  socket.on(`${organizationId}-${userId}`, async (payload) => {
    const someDatas = await findSomeDatas();
    socket.emit(`${organizationId}-${userId}`, someDatas);
  });

  socket.on('error', (error) => {
    console.log('ERROR');
    console.log(error);
  });

  // socket disconnect
  socket.on('disconnect', (reason) => {
    console.log('DISCONNECTED');
    console.log(reason);
    socket.leave(userId);
  });
});

事实证明,我的问题只是因为 deviceId 未定义(客户端错误)。因此,当我的代码运行 socket.emit(deviceId, data) 时,这就是导致此代码无法正常运行的原因。

奇怪的是,它不会抛出错误或任何东西。它只是触发了 socket.on('disconnect') 事件,原因是: “传输关闭”, 在我的客户端浏览器控制台日志上,错误是 “解析错误”。 这就是我的原因似乎错误来自 socket.io 包本身(事实证明,它不是)。

然后我用这样的东西修复它之后:

   if (deviceId) {
      socket.emit(deviceId, someDatas);
    }

又可以用了。

所以,是的。也许在你的情况下,我建议你再重新检查一下,也许这也只是因为业务逻辑上的一个愚蠢的缺陷逻辑,与套接字io本身无关。

© www.soinside.com 2019 - 2024. All rights reserved.