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

所以我试图对我的在线玩家进行实时展示,除了一个问题之外,它的运作效果很好。 当我的应用程序侦听断开连接时,看起来页面刷新触发了这个function,并且所述播放器被注销。

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(); }); 

为什么页面刷新触发这个function? (我知道这是这个函数,因为玩家注销的唯一方式是通过注销链接)我怎样才能让它忽略页面刷新,并只捕获closures浏览器等断开连接?

编辑:我如何“ping”重新连接事件,以便我可以检查页面是否重新加载与closures? 重新加载将有一个即时重新连接,所以我只需要检查重新连接。 我只是不知道如何!

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

 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")

与此同时,您可以成功触发断开连接function,而不必担心页面刷新也会触发事件。