在事件处理程序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已断开连接!原因:运输关闭
答案 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 ");
}
我说的很奇怪,因为尽管有延迟,但仍应处理该事件。 可能是在重新加载页面时,服务器负载很高,并且在处理事件之前,该端口已关闭。
仍然不确定。