在断开连接触发器之前检查客户端重新连接

时间:2014-05-16 17:47:32

标签: javascript node.js express.io

所以我正在尝试实时显示我的在线玩家,除了一个问题之外,它迄今为止运作良好。当我的应用程序侦听断开连接时,似乎页面刷新会触发此功能并且所述播放器已注销。

app.io.route("disconnect", function(req,res) {
    db.query("UPDATE player_data SET online=0 WHERE id="+mysql.escape(req.session.user));
    req.io.broadcast("event", {msg:req.session.username+" has logged out!"});
    app.io.broadcast("reloadXY");
    req.session.destroy();
});

为什么页面刷新会触发此功能? (我知道这是这个功能,因为玩家注销的唯一方式是通过注销链接)我怎样才能让它忽略页面刷新并且只关闭像关闭浏览器这样的断开连接?

编辑:我如何“ping”重新连接事件,以便检查页面是否重新加载而不是关闭?重新加载将立即重新连接,所以我只需要检查所述重新连接。我只是不知道怎么做!

1 个答案:

答案 0 :(得分:2)

感谢Zirak(和Tim Cooper,虽然当时我不知道他的意思),但我能够解决这个问题。他建议我在会话中存储断开连接超时,当有重新连接时(由于页面重新加载而立即),只需在自动注销播放器之前清除超时。

app.io.route("stopDisconnection", function(req) {
    if (req.session) {
        clearTimeout(req.session.disconnection);
        console.log("Timeout cleared");
    }
});

app.io.route("disconnect", function(req) {
    req.session.disconnection = setTimeout(function() {
        console.log("User timed out!");
        db.query("UPDATE player_data SET online=0 WHERE id="+mysql.escape(req.session.user));
        app.io.broadcast("event", {msg:req.session.username+" has logged out!"});
        app.io.broadcast("reloadXY");
        req.session.destroy();
    },5000);
});

只需在index.html上调用io.emit("stopDisconnection")

即可

通过这种方式,您可以成功触发断开连接功能,而无需担心页面刷新也会触发事件。