【问题标题】:returning JSON Array in Node在节点中返回 JSON 数组
【发布时间】:2013-03-30 10:40:51
【问题描述】:

我仍在尝试了解 Node.js 中的异步流程。我试图读取 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 数组。

由于此流程适用于其他语言,我怀疑它与节点的异步流程有关。我不知道如何解决这个问题。

任何帮助都会很棒..

【问题讨论】:

    标签: node.js asynchronous express


    【解决方案1】:

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

    【讨论】:

    • 您好,Nilsh,抱歉格式化。试图使代码尽可能小。是的,我每次迭代都会回调,因为回调在循环之外不起作用。所以使用 if 条件来检查循环结束,这就是代码停止工作的地方。 SourceList 是一个表中的一大组 ID,我用它从 JSON 数组中的另一个表中提取数据并显示给客户端。是的,现在正在考虑更改整个查询。
    • 它停止工作的原因是您必须调用回调才能使流程继续。因此,当您不在find 中调用回调时,它将永远等待。有解决方案(回调同步),例如使用流库(有多个选项),但在这种情况下,我认为你最好修复你的查询,这样就不需要循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多