Javascript Socket.io在多次刷新后停止工作

Javascript Socket.io在多次刷新后停止工作,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我有一个socket.io连接到https服务器,监听javascript向其发送信息。我发现当我刷新时,套接字正在记录连接-因此,如果我在('connection',function(socket){}代码的on('connection',function(socket){})部分中记录某个内容,我将在控制台中看到响应 但是我发现,在服务器端,socket.on()调用没有接收到任何内容 因此,如果我在Javascript中有一行代码是socket.emit('ping',msg),'ping

我有一个socket.io连接到https服务器,监听javascript向其发送信息。我发现当我刷新时,套接字正在记录连接-因此,如果我在('connection',function(socket){}代码的
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);
});
客户端

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);
});

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

var socket = io('https://example.com:1337');
$(document).ready(function() {
    socket.emit('ping', true);
});
如果这是客户端的确切代码,则很可能在连接握手之前调用了
socket.emit
。这可能是随机的,因为有时文档就绪事件可能会延迟。请尝试为emit事件设置超时-

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

然后试一试。如果这样做有效,您就发现了问题。下一步是确保身份验证正常工作-如果没有完整的代码,就很难提出建议。如果您的问题没有得到解决,请随意编辑问题并共享代码。

这是您面临的一个有趣的问题。有多个问题需要解决eck on-但是我建议的第一个问题是以下代码:

var socket = io('https://example.com:1337');
$(document).ready(function() {
    socket.emit('ping', true);
});
如果这是客户端的确切代码,则很可能在连接握手之前调用了
socket.emit
。这可能是随机的,因为有时文档就绪事件可能会延迟。请尝试为emit事件设置超时-

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

然后试一试。如果这样做有效,您就发现了问题。下一步是确保身份验证正常工作-如果没有完整的代码,就很难提出建议。如果您的问题没有得到解决,请随意编辑问题并共享代码。

似乎与您的身份验证中间件有关代码的t位?您处理与套接字相关的变量的方式也有点有趣,在您的身份验证中,您应该在哪里设置这些变量并将它们放在套接字上(套接字只是普通对象,所以
socket.id==socket['id']
)和
socket.user={}
一旦断开套接字连接,跟踪和删除就会容易得多。正如Nicholas提到的,问题似乎与您如何进行身份验证(然后将套接字数据存储在socketUsers中)有关。您甚至没有收到严重错误吗?问题是我在某个地方使用了一个使用createPool的SQL查询-我的SQL连接空间不足,这会破坏代码。谁会想到这可能是我认为代码中最直接的部分。谢谢你们两位的输入通过将数据附加到套接字本身,它实际上帮助我更好地组织事情。看起来这与您的身份验证中间件共享这段代码有关?另外,您处理与套接字相关的变量的方式也有点有趣,在您的身份验证中,您应该设置软管变量并将它们放在套接字上(套接字只是普通对象,所以
socket.id==socket['id']
)和
socket.user={}
在套接字断开连接后将更容易跟踪和删除。正如Nicholas提到的,问题似乎与您如何进行身份验证有关(然后将套接字数据存储在socketUsers中)。您甚至没有收到严重错误吗?问题是我在某个地方使用了一个使用createPool的SQL查询-我的SQL连接空间不足,这会破坏代码。谁会想到这可能是我认为代码中最直接的部分。谢谢你们两位的输入通过将数据附加到套接字本身,它实际上帮助我更好地组织事情。嘿,谢谢你的回答,原来这与使用mySQL的createpool和耗尽sql连接空间有关。谁会想到这会是一个问题?我最近遇到了一个问题:谢谢你的回答,原来这与使用mySQL的createpool并耗尽sql连接空间。谁会想到这会是一个问题?我最近遇到了一个问题:D