好吧,假设我有两个型号。合同和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。
答案 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});
}
});
}
}