サーバーでは、クライアントから読み取ることができるソケットオブジェクトにいくつかの属性をバインドしようとしていますが、これは最初の属性に対してのみ機能します。サーバー側のソケットオブジェクトへのバインド属性が正しく動作していないようです
相続人は私が
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);
});
};
なぜ、クライアント側のソケットオブジェクトにサーバー側のソケットオブジェクトに追加されたプロパティが魔法のように表示されると思いますか? – mscdex
どのようにして、それは時には動作しますか?私もこの質問を見たhttp://stackoverflow.com/questions/17351881/adding-data-to-a-socket-io-socket-object –
そのリンクの答えは 'socket.get()'/'socket .set() 'は、これまで私が実際に見たことがないものです。ただし、コードではこれらのメソッドは使用されません。 – mscdex