0

誤解を招くタイトルで最初に申し訳ありませんが、それを改善することはできませんでした. ここに私の問題があります: 私は NodeJS と socket.IO を使用しています。ゲームのようなもののロビーシステムを手に入れました。ルートを作成し、他の人が参加するなどです。ルームの所有者が接続を閉じたときに、ルーム自体を削除する必要があります。私はこのようにそれをやった

db.game.findOne({ _id: ObjectId(roomId) }, function(err, item)
    {
        if ( err || !item || item.started )
            return;

        if ( item.createdBy == currentUser )
        {
            db.game.remove({ _id: ObjectId(roomId) }, function(err, item) {
                io.sockets.in(roomId).emit('force_interupt');
            });
        }

それは機能していますが、問題があります。人がブラウザで REFRESH を押すだけの場合、Web サーバー (php、nginx、mongod) は最初にゲームのコンテンツを取得します -> それを表示し、その後接続が失われるため、NodeJS によってゲームが削除されます。これを回避する方法はありますか?

4

1 に答える 1

0

部屋のライフサイクルについてどのようなことを期待していますか?

socket.io 接続が閉じたときにルームを閉じたい場合は、すでに必要なものが得られています。

http セッションが期限切れになったときにルームを閉じたい場合は、ルームをセッションに接続する必要があります。つまり、http セッション データにルーム情報を保存し、セッションが期限切れになったときにルームを削除する必要があります。

socket.io 接続が閉じたときにルームを閉じたい場合は、ページのリロードまたは一時的なネットワークの問題が原因で接続が閉じられた場合を除き、次のようにします。

  1. 「終了」コマンドを定義します。クライアント側では、閉じる前に「quit」コマンドを送信します。サーバー側では、「終了」コマンドを受信した場合は、すぐにルームを削除します。
  2. 「quit」コマンドなしで接続が閉じられた場合は、しばらくの間 (例: 30 秒) ルームを保持します。ルームが削除される前にユーザーが再接続した場合は、ルームを保持します。それ以外の場合は、部屋を削除します。
于 2013-02-28T01:53:29.507 に答える