在Node中返回JSON数组

时间:2013-04-08 11:09:38

标签: node.js asynchronous express

我仍然试图了解Node中的异步流程。我试图读取db中的文件列表并将结果转换为json数组并返回。该代码适用于一个json对象。但是在读取完整数组时没有输出

所以这是代码

函数调用 - 从浏览器接收ajax请求并发回结果

module.retrieveSourceContent(req, res, result, function(err, result){
                if(err){
                  console.log(err);
                  return;
                }
                console.log(result);
                res.contentType('json');
                res.write(JSON.stringify(result));
                res.end();
            });

代码

 retrieveSourceContent : function(req, res, sourceList, callback){
        var sourceContent = new Array();
        MongoClient.connect(config.mongoPath+config.dbName, function(err, db) {
           if(err){
             return callback(new Error("Unable to Connect to DB"));
           }
           var collection = db.collection(config.source);
           for( i=0;i<sourceList['sources_FOR'].length;i++){
              //build the source JSON Array
              collection.find({'_id':sourceList['sources_FOR'][i]}).nextObject(function(err, doc) {
                if(err)
                  return callback(new Error("Error finding data in DB"));
                    var sourceObject = {
                        title     :doc.name,
                        tagCount  :doc.tag.length,
                        tags      :doc.tag,       
                        format    :doc.type,     // Differentiate text, image, video and urls
                        content   :doc.data      // Content
                    };
                    sourceContent.push(sourceObject);
                    //if(i == sourceList['sources_FOR'].length - 1)
                      return callback(null, sourceContent);

              });
           }
        });
      }

此代码将一个json对象返回给客户端。如果我取消注释if(i == sourceList['sources_FOR'].length - 1)我没有输出也没有错误。但sourceContent.push(sourceObject);确实成功创建了json数组。

由于此流程适用于其他语言,我怀疑它与节点的asyn流程有关。我在这里如何解决这个问题。

任何帮助都会很棒......

1 个答案:

答案 0 :(得分:0)

由于格式化,跟随程序流程有点困难。但我认为你是正确的,假设这与异步行为有关。如果我没有被格式化所欺骗,那么我认为你在循环的每次迭代中都在进行回调,这只适用于第一次迭代。我不确定您的sourcesList是什么,但我会尝试构建一个包含sourcesList中所有项目的查询。那你就不需要foor循环了。也许你可以使用$in运算符。