【问题标题】:Socket.io stops working after multiple refreshes多次刷新后 Socket.io 停止工作
【发布时间】: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


【解决方案1】:

这是您面临的一个有趣的问题。有多个检查点 - 但是我建议的第一个问题是以下代码:

var socket = io('https://example.com:1337');
$(document).ready(function() {
    socket.emit('ping', true);
});

如果这是客户端的确切代码,则很可能在连接握手完成之前调用了socket.emit。这可能是随机的,因为有时文档就绪事件可能会延迟。尝试为发出事件设置超时 -

var socket = io('https://example.com:1337');
$(document).ready(function() {
    setTimeout(function(){socket.emit('ping', true);},2000);
});

并试一试。如果这有效,您就发现了问题。下一步是确保身份验证正常工作 - 如果没有完整的代码,很难就此提供建议。如果您的问题未解决,请随时编辑问题并分享代码。

【讨论】:

  • 嘿,谢谢你的回答,原来这与使用 mySQL 的 createpool 和用完 sql 连接空间有关。谁会想到这可能是个问题??
  • 好吧,我最近遇到了那个:D
猜你喜欢
  • 2020-02-21
  • 2013-12-12
  • 1970-01-01
  • 2018-06-18
  • 2015-05-13
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
相关资源
最近更新 更多