2014-10-30 73 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 }); 
相關問題