我构建了一个 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"
看起来
.emit()
期望对象作为第二个参数。
我有完全相同的问题,通过传递一个对象来解决:
socket.emit('join', {text: "Some data"});
我一直在偶然发现这个问题,并认为这都是因为套接字io。
我已经尝试过:
基本上,我已经尝试了基于此页面的几种解决方法: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本身无关。