为什么仅在不使用' async'时才返回结果?模块?

时间:2016-02-28 14:49:34

标签: node.js mongodb express asynchronous closures

我使用的技术是Node.js,express和MongoDB。

我有一个名为' getAllRecipes'查询数据库的所有食谱 - 这很好。

在' getAllRecipes'回调方法,然后循环每个条目/配方,以获得它的注释和注释。循环内的任务放在一个封闭内,以模仿“让”。否则每个recipeID都是一样的。

现在我添加了对数组的进一步调用,以便与' async.series'一起使用。 首先,我打电话给“getRecipeNotes'”,当它返回时,我打电话给“getRecipeComments”'在' getRecipeNotes'回调方法。

最终输出显示以下内容:

[
  {
    "_id": "56d070ac7c3965e85d3ebd38",
    "userID": "56cf383a1f8303082484f35f",
    "name": "Chocolate cake",
    "instructions": "Add mixture to bowl, and then mix",
    "dateTimeSubmitted": "2016-02-26T15:35:08.868Z",
    "tags": "cooking, cake, chocolate",
    "active": 1,
    "notes": [],
    "comments": []
  },
  {
    "_id": "56d070ac7c3965e85d3ebd3a",
    "name": "num1",
    "quantity": "5",
    "notes": [],
    "comments": []
  }, ...]

每一个'笔记'以及每一条评论'是空数组。

我已经检查了评论集合,并且有一个针对recipeID的条目:" 56d070ac7c3965e85d3ebd38"。

如果我修改了' getRecipeComments'返回每个食谱的所有评论的方法,然后返回所有评论。

此外,如果我使用recipeID保留查询并使用recipeID在&#34; 56d070ac7c3965e85d3ebd38&#34;之外的getAllRecipes方法之外进行调用,那么它也会返回正确的数据..只是不使用getAllRecipes方法。< / p>

getAllRecipes:

function getAllRecipes( db, callback )
{
    //query( db, {}, 'recipes', callback );
    query( db, {}, 'recipes', function( err, recipeData )
    {
        tempArray = recipeData.slice();

        if( err || !tempArray.length )
            callback( err );
        else
        {
            var taskArr = [];

            for( var i=0; i < tempArray.length; i++ )
            {   
                (function()
                {
                    var tID = tempArray[ i ]._id;
                    taskArr.push( function( iCallback )
                    { 
                        getRecipeNotes( db, tID, function( err2, noteData )
                        { 
                            getRecipeComments( db, tID, function( err3, commentData )
                            {
                                if( err2 )
                                {
                                    iCallback( err2 );
                                    return;
                                }   

                                if( err3 )
                                {
                                    iCallback( err3 );                        
                                    return;
                                }

                                for( var j=0; j < tempArray.length; j++ )
                                {
                                    if( tempArray[ j ]._id === tID )
                                    {
                                        tempArray[ j ].notes                = noteData;
                                        tempArray[ j ].comments             = commentData;
                                    }
                                }

                                iCallback();
                            });
                        });
                    });
                })();
            }

            async.series( taskArr, function( err )
            {
                callback( err, tempArray );

            } );
        }
    });
}

getRecipeComments:

function getRecipeComments( db, recipeID, callback )
{
    query( db, { recipeID : recipeID }, 'comments', callback );
}

查询:

function query( db, query, strColl, callback )
{
    var coll = db.get( strColl );

    coll.find( query, function( err, doc )
   {    
      if( err )
        console.log( err );

      callback( err, doc );
   });
}

我还将调用分为&#39; getRecipeNotes&#39;和&#39; getRecipeComments&#39;两个单独的任务,但结果是一样的。

你能看出为什么笔记或评论拒绝退货吗?

1 个答案:

答案 0 :(得分:0)

问题已经解决。在查询数据库的调用中似乎是一个类型错误。

我只需要做一个简单的事情:

recipeID = recipeID.toString();
查询前的