Socket.io:服务器重新连接客户端的正确方法

我正在用socket.io构buildMEAN应用程序。 当页面刚刚加载时,由于应用程序的单页性质,套接字连接在用户导航到各种页面时build立并保持活动状态。

用户信息在我的套接字连接中可用,这要感谢passport.socketio 。

但是,当用户login或注销时,我希望连接重新初始化,否则套接字将包含有关用户的过时数据。 目前,我试图用这种方式来实现它:当用户login/注销时,服务器通过调用socket.disconnect();断开这个特定客户端的套接字socket.disconnect();

在客户端,我监听disconnect事件,并尝试重新build立连接,如下所示:

  _socket.on('disconnect', function(reason) { _socket.connect(); }); 

好了,现在,当用户注销或进入时,服务器断开客户端连接,此客户端连接回来,并且套接字中的用户信息是最新的。 到现在为止还挺好。

但是,考虑到连接中断的不同情况:服务器重新启动。 以前,它“只是工作”:当我停止我的服务器,连接中断,但是当我再次启动服务器,连接自动重新build立。 但是我添加了我的_socket.connect(); 调用,它不再工作:连接仍然是closures,直到我刷新浏览器中的页面。

我已经检查,当服务器调用disconnect();disconnect处理程序的reason是: io server disconnect 。 而当服务器停止时,原因是: transport close

那么,我已经实现了我的断开连接处理程序如下所示:

  _socket.on('disconnect', function(reason) { if (reason === 'transport close'){ // don't do anything special } else { _socket.connect(); } }); 

现在起作用了。 但是,所有这一切似乎是绝对的肮脏的黑客。 至less,给出的reasonio server disconnecttransport close )似乎只是人类可读的string,所以他们可能在将来会改变,这将导致我的代码停止工作。 而且,应该有更好的方法来做到这一点。 我必须错过一些重要的东西,但是不幸的是我在socket.io上找不到任何好的文档。

所以,问题是:服务器重新连接某个特定客户端的正确方法是什么?

此外,如果你有任何关于socket.io的资源的build议,我会非常感激。