socket.io 'disconnect' 如果页面刷新足够快则不调用

socket.io 'disconnect' not called if page refreshed fast enough

我有以下删节代码:

io.on('connection', function(client) {
    client.uuid = uuid.v4();
    // add client object to server...

    console.log('socket.io:: client connected ' + client.uuid );

    client.on('disconnect', function() {
        console.log('socket.io:: client disconnected ' + client.uuid );
        // remove client object from server...
    });
});

如果我在浏览器中打开这个页面,一切似乎都很好。如果我刷新页面,它将触发 disconnect 然后 connection。但是,如果我刷新得足够快,有时 disconnect 不会被调用,因此客户端数据不会从服务器上清除。有什么办法可以避免这种情况吗?

编辑:改写 reconnect -> connection

adeneo 所述,socket.io 有心跳,可自动检查客户端是否仍处于连接状态。如果 disconnect 代码检测到客户端确实消失了,它就会被触发。复制我的原始问题后,我尝试让服务器保持打开状态,大约 30 秒后,"dead" 客户端被删除。所以要解决这个问题,你只需要等待。 Socket.io 自己搞定一切。

.

TL;DR 您可以在客户端使用这些选项:

const socket = io({
  transports: ['websocket'],
  upgrade: false
});

这将完全阻止导致问题的 socket.io from using the HTTP polling 方法。我在 v4.

上成功使用了这个技巧