2016-04-04 1 views
1

サーバーでは、クライアントから読み取ることができるソケットオブジェクトにいくつかの属性をバインドしようとしていますが、これは最初の属性に対してのみ機能します。サーバー側のソケットオブジェクトへのバインド属性が正しく動作していないようです

相続人は私が

socket.isPlayer = true; 
socket.isWaiting = true; 
socket.playerNum = 0; 

が、クライアント上で実行するものを私が見るすべてはsocket.isPlayer属性です。何が起こっているか、どんなアイデアでも大いに助けになります。

相続人は私の完全なサーバー側のファイル

'use strict'; 

var mongoose = require('mongoose'), 
    PlayingGame = mongoose.model('PlayingGame'), 
    FinishedGame = mongoose.model('FinishedGame'); 

var waitingGame = null; 
/*we use this variable to refrence the socket of the waiting player 
so when we start a game we can set the isWaiting attribute to false 
prevent joining a game with yourself*/ 
var waitingSocket = null; 


/* HELPERS */ 
var emitError = function(socket, err) { 
    socket.emit(err); 
}; 

var getSocketGameId = function(socket) { 
    for (var room in socket.rooms) { 
     if (room.substring(0, 4) === 'game') { 
      return room.substring(5); 
     } 
    } 

    return null; 
} 

/* helpers */ 


var createNewGame = function(socket, username) { 
    var newGame = {}; 
    newGame.player1 = username; 
    var playingGame = new PlayingGame(newGame); 
    socket.join('game:' + playingGame.id); 
    waitingGame = playingGame; 
    console.log('new game room id', waitingGame.id); 

    socket.isPlayer = true; 
    socket.isWaiting = true; 
    socket.playerNum = 0; 
    console.log('socket', socket.playerNum); 
    waitingSocket = socket; 
}; 

var startNewGame = function(socket, username, io) { 
    socket.isPlayer = true; 
    socket.playerNum = 1; 
    console.log('starting new game'); 
    waitingGame.player2 = username; 
    waitingGame.save(function(err) { 
     if (err) emitError('Failed to save game'); 
     else { 
      socket.join('game:' + waitingGame.id); 
      io.to('game:' + waitingGame.id).emit('start new game', waitingGame); 
     } 
     waitingGame = null; 
     waitingSocket.isWaiting = false; 
     waitingSocket = null; 
    }); 
}; 

var closeGame = function(socket, io) { 
    console.log('closing game'); 
    // Check if game is still playing if no, assume its already been closed, do nothing 
    var gameId = getSocketGameId(socket); 
    if (gameId === null) return; 

    console.log('finding ', gameId); 
    PlayingGame.findById(gameId, function(err, game) { 
     if (err) { 
      console.log(err); 
      throw 'Problem finding game when closing'; 
     } 

     console.log(game); 
     // if game found, move PlayingGame to FinishedGame emit game closed to room 
     if (game) { 
      console.log('Saving game to finished games'); 
      var finishedGame = new FinishedGame(game.toObject()); 
      finishedGame.save(function(err) { 
       if (err) throw 'Problem saving finished game when moving playing game to finished game'; 
       console.log('Successfuly saved to finish game'); 
       game.remove(function(err) { 
        if (err) throw 'Problem removing from playing games'; 

        socket.leave('game:' + gameId); 
        // send message to room that the game has been closed 
        io.to('game:' + gameId).emit('game closed'); 
       }); 
      }); 
     } 

    }); 
}; 

var startSpectating = function(socket, gameId) { 
    // Send game info 
    var gameInfo; 
    var found = false; 
    PlayingGame.findById(gameId, function(err, game) { 
     if (err) socket.emit('game not found'); 
     else { 
      gameInfo = game; 
      socket.emit('gameInfo') 

      // Join game room 
      socket.join('game:' + gameId); 

      socket.isPlayer = false; 
     } 
    }); 
}; 

module.exports = function(io, socket) { 
    socket.on('join game', function(data) { 
     console.log('New game request', data); 
     if (waitingGame == null) createNewGame(socket, data.username); 
     else startNewGame(socket, data.username, io); 
    }); 

    socket.on('disconnect', function() { 
     console.log('socket disconnected'); 
     if (socket.isPlayer) closeGame(socket, io); 
    }); 

    socket.on('leaving game', function() { 
     console.log('leaving game'); 
     if (socket.isPlayer) { 
      if (socket.isWaiting) { 
       waitingGame = null; 
       waitingSocket = null; 
      } else { 
       closeGame(socket, io); 
      } 
     } else { 
      // the socket is a spectator all we need to do is remove from room 
      for (var room in socket.rooms) { 
       if (room.substring(0, 4) === 'game') { 
        socket.leave(room); 
       } 
      } 
     } 
    }); 

    socket.on('spectate', function(data) { 
     startSpectating(socket, data.gameId); 
    }); 
}; 
+1

なぜ、クライアント側のソケットオブジェクトにサーバー側のソケットオブジェクトに追加されたプロパティが魔法のように表示されると思いますか? – mscdex

+0

どのようにして、それは時には動作しますか?私もこの質問を見たhttp://stackoverflow.com/questions/17351881/adding-data-to-a-socket-io-socket-object –

+0

そのリンクの答えは 'socket.get()'/'socket .set() 'は、これまで私が実際に見たことがないものです。ただし、コードではこれらのメソッドは使用されません。 – mscdex

答えて

0

短い答えは「あなたがこれを行うことはできません」です。ロングワン以下。

socketは、アプリケーションのサーバ側にあるのオブジェクトです。現在、私はサーバーとクライアントの間でプロパティを共有するための自動化方法を認識していません。その理由は、単純なソケット接続であり、共有する必要があるすべてのデータは、何とかクライアントにを移動させる必要があるからです。つまり単にプロパティを設定するということは、実際のパッケージをクライアントに送ることを意味します。

しかし、これはあなたがクライアントににそれらを送信せずににサーバ側のプロパティのいずれかの種類を保存することができないことを意味するので、これは非常に非効率的です。そして、あなたはそのような「オプション」が必要です。

単純なプロパティを設定するだけでは、純粋なJavaScriptでは何も行いません。いわゆるマジック関数、ゲッター/セッター、あらゆる種類のJS機能の「新しい」タイプが必要です。私が意味することは、何かを設定したかどうかを判断するための組み込みの方法はないということです。これは、あなたの状況で2番目に大きなノー・ノーです。

p.s. あなたが共有したトピックを慎重に読んだら、単にNote that this is only on one side (either client or server)と書いてあります。これは、メソッドをオーバーライドしないようにプロパティを設定する単なるメソッドです(emitなど)。

+0

私はまだisPlayerプロパティがクライアント上でどのように見えるのでしょうかと疑問に思っていますか? –

+0

プロパティが偽であれば、そこに行く:D –

+0

プロパティは時々真実で、それは必要なように動作します –

関連する問題