2

私は socket.io を使用して Node.js チャットを作成し
console.loghistoryます [null,null,null......[ { username: 'Nobody Example', message: '231', date: '03/21/2013 14:23:58' } ]]

これらのヌルが配列にあるのはなぜですか?
これが私のコードの一部です。

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));
});

コンソール ログ:

真実
間違い
[ヌル、ヌル、ヌル、ヌル、……、ヌル、[]]
4

2 に答える 2

6

空の配列があり、それを大きな数字 (部屋 ID など) でインデックス付けすると、その数字より前の配列内のすべてのスロットが埋められます (これは JSONundefinedに変換されます)。null

そのため、代わりに履歴をオブジェクトにしてみてください。

var history = {};
于 2013-03-21T15:18:18.900 に答える
0

以下のコードを object(hash); に変更してみてください。

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);

});
于 2013-03-21T15:11:17.050 に答える