调试为什么未命中socket.on

时间:2019-04-03 10:51:03

标签: javascript node.js express socket.io

此问题发生在我的应用程序的客户端。 我遇到了一个问题,那就是在我的Node应用程序上未命中socket.on事件。通常在客户端首次加载网站时发生。加载时,选项卡通常具有在Javascript中动态生成的数据,但是由于未命中socket.on事件,因此未加载此内容,导致选项卡为空白(基本Pug / Jade文件仍在渲染-只是没有动态内容)。刷新页面通常可以解决该问题,套接字会再次开始接收数据。

没有正在输出的直接错误消息,只是未命中socket.on事件。页面重新加载并且没有100%的时间出现后,这似乎也可以解决。

这甚至更不寻常,因为在调试模式下运行我的Node服务器时,它会显示socket.io-parser对数据进行编码,而socket.io-client正在写入数据,这意味着正在发送数据,只是没有发出在我客户端的socket.on上拾取。

请注意,此操作已简化

io.sockets.on('connection', function (client) {
    sendExampleData();
});
function sendExampleData() {
    mysqlFunc.getOrderData(function(rows){
        io.emit('example_data', rows);
    })
}
socket.on('example_data', function (rows) {
    console.log(rows);
}

我希望在页面加载时发出数据,并且socket.on事件将接收此数据,准备进行处理。目前,尽管不是每次都发生,但是socket.on并没有被点击,数据也没有被捕获。

在“调试”模式下运行服务器时,没有什么异常之处,任何想法都将非常有帮助。如果还有其他信息对帮助调试此问题有用,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:0)

我终于设法弄清了问题所在。 我的socket.on事件侦听器位于我的$ {document).ready内部,未在第一页加载时调用。我假设事件监听器没有足够早地定义,因此当我在连接上进行socket.emit时,事件监听器实际上并未加载。

我移出了$(document)内部的所有逻辑。准备就绪,并将事件侦听器移至连接事件(感谢技巧Marc)。

socket.on('connect', function(){
    socket.on('data_1', funcOne);
    socket.on('data_2', funcTwo);
    socket.on('data_3', funcThree);
    socket.on('data_4', funcFour);
    socket.on('data_5', funcFive);
});

此问题已解决,现在每次加载页面时都点击socket.on。 感谢您的帮助,希望这可以对遇到此问题的人有所帮助!