我试图使用Node.js在mongoose的嵌套查询中向元数添加元素

时间:2016-04-27 02:15:39

标签: node.js mongoose

我在Async.waterfall结束时得到一个空数组,不知道为什么,但这是我的代码的样子:

exports.GetJobs = function(req,res){
     var Jobs =[];  ///// Jobs is a global variable

    async.waterfall([
        function(next){
            // get my alert
            UserAlertDB.find({User:req.user.id},function(err,AlertResult){
                next(null,AlertResult);
            })
        },
        function(AlertResult, next) {

            // You might get an error if you do not have created an alert so AlertResult[0].Words will not exist
            if(AlertResult) // if Alert Result not equal to null then query by alert
            {
                JobDB.find({title: new RegExp(AlertResult[0].Words, 'i')}, function (err, JobResults) {

                    if (err) console.log(err);
                    // If the job matches the requirements for alert then push it to the list
                    JobResults.forEach(function(job){
                        JobOffer.find({JobID : job._id, JobOfferOwnerID: req.user.id}, function(err,Offers){
                            if(err) console.log("Error Inside Querying Jobs Result for Alert " + err);

                            if(Offers.length==0){
                                console.log("Jobs are : " +  JSON.stringify(Jobs)) // when I print the Jobs array here it shows that a job is getting pushed into the array
                                Jobs.push(job);
                            }
                        })

                    })
                    next(err,Jobs) // But Jobs here is empty
                })
            }
            else{
                next("There is an error",null)
            }
        }
    ], function(err,Jobs){
        console.log(JSON.stringify(Jobs)); ////// Getting Empty Jobs here
        if(err) console.log("Error Inside Get Jobs Match Alert Data in Server : " + err);
        res.json(Jobs);  ////// Jobs here is empty
    });
  }

所以如果你注意到当我尝试最后发送Jobs数组时res.json(Jobs)有空的Jobs,虽然我已经在Jobs数组中推送了那些作业。

1 个答案:

答案 0 :(得分:1)

代码中的问题是JobResults.forEach是同步的,并且您正在forEach循环中调用异步JobOffer.find。因此,您的程序不会等待异步操作完成并立即调用下一个(错误,作业)。而不是forEach仅在async.each完成时使用async.each并调用next(错误,作业)。我还建议你确保检查每个回调中的错误值,例如,即使可能存在错误,你也会传递null:

 // get my alert
 UserAlertDB.find({User:req.user.id},function(err, AlertResult) {
     next(err, AlertResult);
 })

希望它有所帮助,如果您需要其他任何有关代码的帮助,请与我们联系。