【发布时间】:2019-09-17 02:12:24
【问题描述】:
我有一个 socket.io 连接到一个 https 服务器,监听 javascript 以向它发出信息。我发现当我刷新时,套接字正在记录连接 - 所以如果我 console.log 在代码的on('connection', function(socket) { } 部分中记录某些内容,我将在控制台中看到响应。
我发现,在服务器端,socket.on() 调用没有收到任何东西。
因此,如果我在 Javascript 中有一行 socket.emit('ping', msg),则“ping”将在服务器端进行前 9-10 次刷新,然后在第 11 次刷新时它将停止工作 - 它将停止工作在所有设备和所有浏览器上。所以如果我打开另一个浏览器并尝试加载它,它也不会工作。
我检查了是否有多个连接建立或类似的东西,但我没有看到任何东西。知道为什么会发生这种奇怪的行为吗?
服务器端
io.use(function(socket, next) {
// Authentication of the user is happening here - checking for cookies, sessions, etc.
}).on('connection', function(socket) {
// Setting up some variables and checking other stuff
var socketID = socket["id"];
var username = socketUsers[socketID];
locked[socketID] = {};
// Checking for the username
if(username == '' || typeof username == "undefined") {
// Emit some stuff back to Javascript
io.to(`${socketID}`).emit('criticalError', true);
return false;
}
else {
// We have a valid login, so connect to the server
++connected;
// This line will console log every time I refresh
console.log("Some text");
socket.on('ping', function(msg) {
// This line will console log for the first 9-10 refreshes, and then it suddenly stops working. Any ideas why?
console.log('Server was pinged by ' + username);
});
// This line will console log every time I refresh
console.log("Some other text");
}
});
客户端
var socket = io('https://example.com:1337');
$(document).ready(function() {
socket.emit('ping', true);
});
【问题讨论】:
-
看起来这与您的身份验证中间件共享那段代码有关?
-
此外,您处理与套接字有关的变量的方式在您的身份验证中有点有趣,您应该在其中设置这些变量并将它们放在套接字上(套接字只是普通对象所以
socket.id == socket['id']) 和socket.user = { <user data> }在套接字断开连接后将更容易跟踪和删除。 -
正如 Nicholas 提到的,看起来问题可能与您如何进行身份验证(然后将套接字数据存储在 socketUsers 中)有关。您甚至没有收到严重错误吗?
-
原来问题是我在某处使用了一个使用 createPool 的 SQL 查询——我的 SQL 连接空间用完了,它破坏了代码。谁会想到这可能是我认为代码中最直接的部分。谢谢你们的意见,它实际上通过将数据附加到套接字本身来帮助我更好地构建事物。
标签: javascript node.js socket.io