Node.js - socket断开事件无法正常工作

3
在我的 Node 应用程序中,我使用 socket.io 实现了 websocket 功能。

为了让客户端知道服务器何时不可用,我正在使用以下代码:

socket.on('disconnect', function(){
        //show error to client
    });

这种方法很好,但是有一个不好的副作用。每当我点击链接离开页面(或重新加载页面)时,消息框就会弹出,因为客户端断开连接。我肯定不想每次访问者单击链接时都显示“服务器不可用”的消息。
我可以在错误消息上设置一个超时,给浏览器足够的时间在错误显示之前导航到其他页面。但是您会承认这是一个低劣的解决方案。此外,还存在两个问题:
1) 在需要实际显示错误消息时,计时器将延迟显示错误消息,使用户无法使用应用程序并且在该间隔期间没有通知
2) 这不适用于页面重新加载(我认为)
总之,肯定有更好的方法。对吧?
注意:这是Firefox中的问题,但Chrome中没有。尚未测试其他浏览器。Firefox还在控制台中显示错误消息,说明websocket连接被中断,我倾向于相信这两个问题有共同的原因。我阅读了很多关于此控制台错误的问题和答案,但没有一个似乎适用于我的情况。
4个回答

3

我以前遇到过这种情况。

您想知道用户何时离开页面,而又不想弹出错误。

使用 onbeforeunload 来表示他们正在离开,然后只需设置一个布尔值,以便 socket.io 不会触发错误。

window.onbeforeunload = function(){
  window.unloading = true;
  return; // don't return a string here or it will pop up asking user if they want to navigate away.
}

socket.on('disconnect', function(){
  // setTimeout might be optional depending on when onbeforeunload is called
  setTimeout(function(){
    if (!window.unloading)
      //show error to client 
  }, 10); // 10 ms should be long enough for onbeforeunload, and short enough so your real disconnects don't wait
});

在用户试图导航离开页面时,会调用on before unload。

通常,它被用来调用一个消息,询问用户是否希望继续导航,但你也可以设置一个变量,表示断开连接并非错误。


1
为什么不尝试在页面导航时取消注册断开处理程序?
function alertfun(){
    //show error to client
}
socket.on('disconnect', alertfun);

window.onbeforeunload = function(){
    socket.removeEventListener('disconnect',alertfun);
}

您可以对同一事件拥有多个监听器。删除您不想要的监听器。您应该尝试这样做,因为我不确定disconnect事件是在onbeforeunload之前还是之后触发。

0

本文解释了这个问题:https://dev59.com/AIDba4cB1Zd3GeqPCEZF#24009316。如果您不使用Angular / Backbone或类似的单页面应用程序方法,您将永远无法在不打开新页面的情况下导航到页面,从而每次都会为每个打开的窗口生成新连接,或者在每次服务器刷新时连接和断开一个新的套接字实例而没有target=blank。这就是真实的故事,没有任何魔法技巧可以做到。


0

我遇到了这个问题。 我做错了什么

<a href="<path>" >Link Name</a>

我是如何解决的

<a href="<path>" target="_blank">Link Name</a>

我曾经有同样的问题,后来找到了一些原因,希望这能帮到你。请查看链接


有什么办法可以让它在页面重新加载时工作,而不仅仅是在链接点击时? - sveti petar
不,它不能使用reload。请阅读链接中@T.J. Crowder的评论。 - Harpreet Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接