所以我正在尝试实时显示我的在线玩家,目前为止一切正常,除了一个问题。当我的应用程序监听断开连接时,页面刷新似乎触发了此功能并且所述玩家已注销。
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”重新连接事件,以便检查页面是重新加载还是关闭?重新加载将立即重新连接,因此我只需要检查所述重新连接。我就是不知道怎么办!
最佳答案
感谢 Zirak(和 Tim Cooper,虽然当时我不明白他的意思),我得以解决这个问题。他建议我在我的 session 中存储一个断开连接超时,当有重新连接时(由于页面重新加载而立即),只需在它自动注销播放器之前清除超时。
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")
这样,您就可以成功触发断开连接功能,而不必担心页面刷新也会触发事件。
关于javascript - 在断开连接触发器之前检查客户端重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23701582/