2013-03-21 212 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