1

そのため、オンライン プレーヤーをリアルタイムで表示しようとしていますが、これまでのところ、1 つの問題を除いてうまく機能しています。私のアプリが切断をリッスンすると、ページの更新によってこの機能がトリガーされ、プレーヤーがログアウトされたように見えます。

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」するにはどうすればよいですか? リロードするとすぐに再接続されるので、その再接続を確認するだけです。方法がわかりません!

4

1 に答える 1

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

io.emit("stopDisconnection")そして単にindex.htmlを呼び出すだけです

これにより、ページの更新によってイベントがトリガーされることを心配することなく、切断機能を正常にトリガーできます。

于 2014-05-16T23:44:37.897 に答える