从Async调用返回Mongoose查询结果

时间:2017-08-09 20:52:04

标签: node.js mongodb express mongoose async.js

我正在解决一个问题,我需要在db中查询Voter的一个实例,并使用该实例更新Election,返回原始函数,无论该更新是否成功。我的代码目前看起来像这样:

function addCandidatesToElection(req, res) {
    let electionName = req.body.electionName;
    let candidates = req.body.candidates;
    let addedCandidatesSucessfully = true;
    for(let i=0; i<candidates.length; i++) {
        addedCandidatesSucessfully = _addCandidateToElection(electionName, candidates[i]);
        console.log("added candidates sucessfully:" + addedCandidatesSucessfully);
    }
    if(addedCandidatesSucessfully) {
        res.send("createElection success");
    } else {
        res.send("createElection fail");
    }
}

调用此函数:

function _addCandidateToElection(electionName, candidateName) {
    async.parallel(
    {
        voter: function(callback) {
            Voter.findOne({ 'name' : candidateName }, function(err,voter) {
                callback(err, voter);
            });
        }
    },
    function(e, r) {
        if(r.voter === null){ 
            return 'Voter not found';
        } else {
            Election.findOneAndUpdate(
            {'name': electionName },
            {$push: { candidates: r.voter }},
            {new: true},
            function(err, election) {
                if(err){ return err; } 
                return (election) ? true : false;
                });
            }
        }
    );
}

我已经尝试打印出Voter实例(r.voter)来检查它是否存在(它确实存在),还打印出mongoose调用返回的选举对象,这也有效。但是,我在

中获得了空值
addedCandidatesSucessfully = _addCandidateToElection(electionName, candidates[i]);

行,不管调用的结果如何。我认为它与mongoose调用有关,返回一个永远不会返回到调用_addCandidateToElection的函数的本地值,但我不知道应该如何返回它。我尝试过设置控制标志,例如

let foundAndUpdatedElection = false;

在_addCandidateToElection的第一行并在Mongoose查询的回调中更新它,但显然它没有改变。 我该如何将查询结果返回给addCandidatesToElection函数?

1 个答案:

答案 0 :(得分:0)

你可能应该“宣传”你的代码,以帮助你更好地处理js的异步性质。尝试以下代替您的示例:

df.schema()

您也不再需要使用异步库,因为承诺现在在ES6中是原生的