2013-03-21 50 views
2

我創建使用socket.io
的問題Node.js的聊天的是,當我看到的historyconsole.log我看到一個數組與空了很多並在結束我的歷史記錄 [null,null,null......[ { username: 'Nobody Example', message: '231', date: '03/21/2013 14:23:58' } ]]的NodeJS - 創建數組空數組結果有很多空的

這些空值是如何來到陣列中?
這是我的代碼的一部分。

var history = []; 

io.sockets.on('connection', function (socket) { 

    socket.on('send', function (message) { 
     var date = time(); 

     io.sockets.in(socket.room).emit('message', socket.username, message, date); 

     history[socket.room].push({ username: socket.username, message: message, date: date }); 

     console.log(history); 

    }); 

    socket.on('joinroom', function (room, username) { 
     socket.room = room; 
     socket.join(room); 

     if (typeof history[room] === 'undefined') 
      history[room] = []; 

    }); 

}); 

編輯更多細節:

創建用於每個房間的空數組時的問題是在「joinroom」事件。
這裏是我做了一些測試:

socket.on('joinroom', function (room, username) { 
    socket.room = room; 
    socket.join(room); 

    console.log(typeof history[room] == 'undefined'); 
    history[room] = []; 
    console.log(typeof history[room] == 'undefined'); 
    console.log(JSON.stringify(history)); 
}); 

控制檯日誌:

true 
false 
[null,null,null,null,..................,null,[]]
+0

我想你想'history'是一個對象而不是數組:'VAR歷史= {};' – robertklep 2013-03-21 14:25:49

+0

然後我要去怎麼加每個房間的歷史記錄? '.push()'僅被Array支持。 – 2013-03-21 14:27:21

+0

你不是直接推到'history',而是在*'history'中的數組*上,這樣就可以工作得很好。 – robertklep 2013-03-21 14:29:18

回答

5

如果你有一個空數組和索引它有大量(就像你的房間的ID),這個數字之前,陣列中的所有插槽都充滿了undefined(這相當於在null JSON)。

所以要儘量創造歷史的對象,而不是:

var history = {}; 
+0

Ooook,在JSON中轉換爲'null',這就是我在這裏的原因。謝謝。 – Atrahasis 2016-11-14 16:58:14

0

試試下面的代碼更改爲對象(散);

var history = {}; 

io.sockets.on('connection', function (socket) { 

socket.on('send', function (message) { 
    var date = time(); 

    io.sockets.in(socket.room).emit('message', socket.username, message, date); 

    if(history[socket.room] !== undefined) { 
      history[socket.room].push = { username: socket.username, message: message, date: date }; 
    } else { 
     history[socket.room] = [{ username: socket.username, message: message, date: date }]; 
    } 

    console.log(history); 

}); 
+0

這是錯誤的,因爲它只保留每個房間的最後一項。 'history [socket.room] ='必須是數組。 – 2013-03-21 15:21:17