服务器重新启动并重新连接后,Socket.io客户端事件侦听器未侦听

时间:2017-10-24 14:14:14

标签: javascript node.js sockets socket.io

Socket.io客户端工作正常,直到服务器中断/重新启动。

服务器恢复后,它会重新连接,但是当发出事件时,我的所有客户端侦听器都不再触发。

网上似乎没有太多关于此的内容,但从我到目前为止所阅读的内容来看,这是我尝试过的:

  1. 在函数中包装我的所有.on侦听器,然后在每次客户端库重新连接/连接时调用该函数。

  2. 将我的所有io实例包装在一个函数中,每次调用它时都会返回它们的新实例。

  3. 跟踪服务器上的所有房间,然后重新连接后重新加入所有房间。

  4. 创建io实例时将'multiplex'设置为false。

  5. 这些都没有给我带来任何好运。

    这是最相关的github问题,没有答案: https://github.com/socketio/socket.io/issues/1633

    因为我的客户端上有所有房间名称,所以我可以重新连接这些房间而不使用像Redis这样的东西?感谢。

    更新 在尝试了许多不同的策略一天后,似乎为每个命名空间创建一个.on('connection',fn)侦听器将使客户端和服务器正确地重新连接

     io.of('namespace').on('connection', function(){
            console.log("namespace connected")
     });
    

    如果你没有这个,socket.io仍然可以工作和连接,但它不会重新连接工作的客户端监听器。

    我认为这应该是库中更新的内容。

    无论如何,关于我的特殊问题,我仍然有一个问题:

    我需要能够处理动态命名空间

    io.of('namespace-<id>').on('connection', function(){
         console.log("namespace id: <id> connected")
    });
    

    如果我有通配符支持,例如

    ,这将是完美的
    io.of('namespace-*').on('connection', function(){
         console.log("namespace id: <id> connected")
    });
    

    完全符合我的情况。我浏览过不同的图书馆,比如这个:

    https://www.npmjs.com/package/socket.io-events

    但它只支持事件的通配符和正则表达式,而不支持名称空间。

1 个答案:

答案 0 :(得分:0)

我提出的解决方案的答案是使事件名称动态而不是命名空间。

所以而不是

io.of('namespace-<id>').on('myevent', function(){
     console.log("namespace id: <id> connected")
});

我做

io.of('namespace').on('myevent-<id>', function(){
     console.log("namespace id: <id> connected")
});

但是,我确实想说,我这样做的唯一原因是因为我正在构建我的应用程序。 我想在分离关注点(EG页面到页面)时使用命名空间,在分离行为时使用空间(对于查看相同数据的两个不同方的EG缓存通知)。

除非您有特别想要动态命名空间的具体原因,否则您应该使用房间,因为这是它们的设计目的。