2015-02-05 118 views
0

好吧,让我说我有两个模型。合同和CommLog。这两项工作都是独立发现的,但我需要许多CommLog来与每个合同相关联。NodeJS的新手。猫鼬如何异步多个查询?

在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;}); 

}; 

当我试图显示位置VAR通讯科= contract.getCommLog()使用它

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); 
}); 
}); 

;它不会返回任何东西,因为getCommLog()没有执行异步...

我认为它是我对猫鼬查询的误解,所以如果你明白我想完成什么,请让我知道我在做什么错误。我试过没有异步,总是会返回false。

+0

好吧..所以我设法得到它的工作,但没有通过调用.getCommLog()。相反,我只是用find查询做了一个async.parallel。希望能够保持模型中的方法,但我想这不会在这种情况下工作。 – Tyler 2015-02-05 20:45:29

回答

0

查找调用可以返回所有匹配的结果与一个查询,所以我不认为你需要在这里的异步。当你调用res.json(data)时,它没有正确填充的原因是因为你没有等待方法调用完成,然后再启动服务器响应。你最好在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}); 
      } 
     }); 
    } 
}