SocketIO服务器无法处理来自客户端的触发事件

时间:2018-08-17 12:05:36

标签: javascript node.js socket.io

在事件处理程序window.onunload中,客户端触发事件:

function onPageUnload() {
   userSocket.emit('command', "{'cloudBackup': 'cancel'}");
}

在服务器上,我有一个侦听器:

io.on('connect', function(socket) {
    console.log("RIKO ::: SocketIO connected!");

    socket.on('command', function(msg) {
        console.log("RIKOO ::: command with msg : " + msg);
        backupOnceProcCanceled = true;
        console.log("PC = " + backupOnceProcCanceled)
        // throw new Error("RIKO ::: Thrown Error at backup2.js line 106")
    });

    socket.on( 'disconnect', function(reason) {
        console.log("RIKO ::: SocketIO disconnected! Reason : " + reason );
    })
})

当客户端刷新/离开/导航页面时,我看到浏览器触发了该事件 ('command', "{'cloudBackup': 'cancel'}")

但是服务器未检测到该事件。仅当端口关闭时:

  

RIKO ::: SocketIO已断开连接!原因:运输关闭

2 个答案:

答案 0 :(得分:0)

您使用的通配符不是捕获所有事件的有效方法。您可以编写一些中间件来捕获这些东西:

io.on('connect', function(socket) {
    console.log("RIKO ::: SocketIO connected!");

    socket.use((packet, next) => {
        console.log("RIKOO ::: command with msg : " + msg);
        backupOnceProcCanceled = true;
        console.log("PC = " + backupOnceProcCanceled)
        // throw new Error("RIKO ::: Thrown Error at backup2.js line 106")
        next();
    });

    socket.on( 'disconnect', function(reason) {
        console.log("RIKO ::: SocketIO disconnected! Reason : " + reason );
    })
})

为此专门添加了socket.use()函数。您可以通过以下链接查看文档:{​​{3}}

或者,您也可以通过将*更改为command来捕获此特定事件。

答案 1 :(得分:0)

很奇怪,但是在"onPageUnload"函数中插入延迟解决了该问题。

function waitMs(ms) {
   var start = Date.now()
   var now = start;
   while(now - start < ms){
       now = Date.now()
   }
}

function onPageUnload() { //window.onunload = onPageUnload;
   userSocket.emit('command', "{'cloudBackup': 'cancel'}");
   waitMs(50);
   console.log("SOCKET send cloudBackup cancel 1 ");
}

我说的很奇怪,因为尽管有延迟,但仍应处理该事件。 可能是在重新加载页面时,服务器负载很高,并且在处理事件之前,该端口已关闭。

仍然不确定。