1

私はまだ Node.js の非同期フローについて理解を深めようとしています。db 内のファイルのリストを読み取り、結果を json 配列に変換して戻そうとしています。このコードは、1 つの 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);

              });
           }
        });
      }

このコードは、1 つの json オブジェクトをクライアントに返します。コメントを外すif(i == sourceList['sources_FOR'].length - 1)と、出力もエラーもありません。しかしsourceContent.push(sourceObject);、json配列を正常に作成します。

このフローは他の言語でも機能するため、ノードの非同期フローと関係があると思われます。これを解決する方法について、ここで途方に暮れています。

どんな助けでも素晴らしいでしょう..

4

1 に答える 1