2015-02-05 119 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}); 
      } 
     }); 
    } 
}