SocketIO / Mongoose JS .push to array问题

时间:2015-02-18 17:30:24

标签: javascript node.js mongoose socket.io

这是使用NodeJS,SocketIO和&猫鼬。

客户端按钮正在触发服务器端'LoadF'套接字,它应该通过mongoose进行3次查询,并在套接字回调中发回结果。我正在尝试将每个Mongoose查询结果推送到一个数组,该数组将作为单个字符串化的JSON发回。

问题是.push没有填充'doc'数组。我认为这可能是一个范围问题,但我已经尝试了所有可以想到的组合,但没有结果。

代码(仅显示3个猫鼬查询中的1个):

socket.on('loadF', function(data,callback){
        var doc = [];
        console.log("before:" + toString(doc));
        filldoc(function(err, assets){
            if (err) return console.error(err);
            console.log("during:" + assets);
            doc.push(JSON.stringify(assets));
        });
        callback(doc.join(','));
        console.log("after:" + doc[0]);
        function filldoc(callback){
            initCm.find({}, function(err, assets){
                if (err) return callback(err, null);
                callback(null, assets[0]);
            });
        }
    });

这是我从日志中获得的输出没有错误:

before:[object Undefined]
after:undefined
during:{ _id: 54e4c934b61b8b6824ff38aa,
  id: 'document',
  version: '1.0',
  __v: 0 }

'during'输出显示应该放入数组的内容。

不确定为什么''''在'之后'来临之后呢?无论我尝试什么,似乎总是如此。

1 个答案:

答案 0 :(得分:0)

filldoc()是异步的。这意味着您只能处理它在您提供的回调中创建的结果。这些代码行的当前位置:

callback(doc.join(','));
console.log("after:" + doc[0]);

将在filldoc完成其工作之前运行并调用其回调,因此doc仍为空。相反,你需要像这样移动回调内部的那些:

socket.on('loadF', function(data,callback){
    var doc = [];
    console.log("before:" + toString(doc));
    filldoc(function(err, assets){
        if (err) return console.error(err);
        console.log("during:" + assets);
        doc.push(JSON.stringify(assets));
        callback(doc.join(','));
        console.log("after:" + doc[0]);
    });

    function filldoc(callback){
        initCm.find({}, function(err, assets){
            if (err) return callback(err, null);
            callback(null, assets[0]);
        });
    }
});