2014-10-30 69 views
0

我有以下代码:我在node.js中接收消息和对象插座未定义

function Socket(io, playGame, mapper) { 
    io.on('connection', function (socket) { 
     // message handler for the chat message 
     socket.on('sendChat', function (data) { 
      console.log(socket); 
      console.log(data); 
      console.log('recieved chat'); 

      var connectedPlayer = playGame.findConnectedPlayer(socket); 
      if (!connectedPlayer) 
       return; 

      var connectedGame = playGame.findConnectedGame(socket, connectedPlayer.gameId); 
      if (!connectedGame) 
       return; 

      // send update game with players properly ordered 
      for (socketIndex in this.sockets) { 
       var socket = this.sockets[socketIndex]; 

       // send the new data to each player 
       socket.socket.emit('chatUpdate', { chatText: data.chat }); 
      } 
     }); 

     // message handler for join game message 
     socket.on('joinGame', function (data) { 
      console.log('recieved join:', JSON.stringify(data)); 

      if (!playGame.newConnectedPlayer(socket, data)) 
       return; 

...

在用于sendChat的方法中,插座是未定义的。在joinGame的方法中,定义了套接字。我尝试了几个想法,但问题依然存在。任何帮助,将不胜感激。

+0

你确定'this.sockets'和'this.sockets [socketIndex]'存在吗? – 2014-10-30 21:01:28

回答

0

你必须重新命名2个socket变量之一 - 无论是参数'connection'或回路中的var

io.on('connection', function (socket) { 
for (socketIndex in this.sockets) { 
    var socket = this.sockets[socketIndex]; 

varshadowing参数,渲染该参数不可访问。

发生这种情况的部分原因是var socket不仅存在于for循环中。 JavaScript的var s为function -scoped和他们的声明是hoistedfunction顶部,如:

socket.on('sendChat', function (data) { 
    var connectedPlayer, connectedGame, socket; // each initially `undefined` 

    console.log(socket); 

    // ... 

    for (socketIndex in this.sockets) { 
     socket = this.sockets[socketIndex]; 

    // ... 
}); 

而且,具有相同的确切名称,最多只有一个可以从特定function达成。


还要注意的是,for环和var socket是不是真的有必要。

您可以使用Socket.IO Serverown .emit() method向所有客户端发送消息。

io.emit('chatUpdate', { chatText: data.chat });