NodeJS新手。 Mongoose如何异步多个查询?

时间:2015-02-05 18:13:52

标签: node.js mongoose

好吧,假设我有两个型号。合同和CommLog。这两项工作都是独立完成的,但我需要很多CommLog才能与每份合同相关。

在ContractSchema中尝试异步

ContractSchema.methods.getCommLog = function getCommLog(){

var log = false;
async.parallel([
    function(){
        CommLog.find({commType:'contract',parent:this._id},function(err,comms){
            log = comms;
        });
    }],
    function(){return log;}); 

};

我正在尝试使用它

router.get('/:code', function(req, res, next) {
Contract.findOne({accessCode:req.params.code},function(err,contract){
    if(err)
        res.send(err);

    var data;
    if(contract != null){
        var comms = contract.getCommLog();
        data = {error:false,data:contract,commlog:comms}

    }else{
        data = {error:true,message:"No Contract"}
    }
    res.json(data);
});
});

显示var comms = contract.getCommLog();它永远不会返回任何东西,因为getCommLog()没有执行异步...

我认为这是我对猫鼬查询的误解,所以如果你理解我想要完成的事情,请让我知道我做错了什么。我试过没有异步,总是返回false。

1 个答案:

答案 0 :(得分:0)

查找调用可以使用一个查询返回所有匹配结果,因此我认为您不需要在此处进行异步。调用res.json(数据)时它没有正确填充的原因是因为在启动服务器响应之前,您没有等待方法调用完成。最好在Contract.find调用中嵌套一个额外的CommLogs.find调用,并且只在完成后发送您的响应。

//伪代码:

Contract.find({}, function(err, contract) {
    if(err || !contract) {
        //return error response
    } 
    else {
        CommLogs.find({contract: contract._id}, function(err, commlogs) {
            if(err || !commlogs) {
                //return error response 2
            }
            else {
                res.json({errors: false, contract: contract, commlogs: commlogs});
            }
        });
    } 
}