2015-10-20 71 views
4

我是新来的猫鼬。 这里是我的情况:如何保存从猫鼬query.exec()函数返回的对象

var childSchema = new Schema({ name: 'string' }); 
var parentSchema = new Schema({ 
children: [childSchema]}); 
var Parent = mongoose.model('Parent', parentSchema); 

说我已经创建了有孩子的父母“P”,而我查询“P”,利用

var query = Parent.find({"_id":"562676a04787a98217d1c81e"}); 
query.select('children');         
query.exec(function(err,person){        
    if(err){              
     return console.error(err);        
    } else {              
     console.log(person);          
    } 
});              

我需要访问外部人员对象异步功能。任何想法如何做到这一点?

回答

5

猫鼬的find()方法是asynchronous这意味着你应该使用一个回调,你可以从find()方法包裹查询。例如,你的情况,你可以定义一个回调的

function getChildrenQuery(parentId, callback){ 
    Parent.find({"_id": parentId}, "children", function(err, docs){ 
     if (err) { 
      callback(err, null); 
     } else { 
      callback(null, docs); 
     } 
    }); 
} 

然后你可以这样调用:

var id = "562676a04787a98217d1c81e"; 
getChildrenQuery(id, function(err, children) { 
    if (err) console.log(err); 

    // do something with children 
    children.forEach(function(child){ 
     console.log(child.name); 
    }); 
}); 

你可以采取另一种方法是,承诺在exec()方法返回Promise,这样你就可以做到以下几点:

function getChildrenPromise(parentId){ 
    var promise = Parent.find({_id: parentId}).select("children").exec(); 
    return promise; 
} 

然后,当你想获得的数据,你应该让异步:

var promise = getChildrenPromise("562676a04787a98217d1c81e"); 
promise.then(function(children){ 
    children.forEach(function(child){ 
     console.log(child.name); 
    }); 
}).error(function(error){ 
    console.log(error); 
}); 
+1

非常感谢(y) – kumarD

0

你不能访问它回调的外部(=“异步函数”你提到)。这就是node.js的工作原理:

  • 您对数据库的调用需要一些时间 - 比较它只是执行简单的代码语句很长时间。
  • Node.js是非阻塞的,因此它不会等待数据库返回结果,并且它将通过在query.exec语句后执行代码而立即继续。
  • 因此,您在执行query.exec语句之后编写的代码在数据库返回结果之前运行,因此不可能在那里使用该结果。

但是...怀抱异步编程:

  • 只写你需要进入“异步函数”
  • 代码传递一个回调到您的功能,从“异步函数调用它“并通过它查询结果
+1

非常感谢:) – kumarD