如何保存从mongoosequery.exec()函数返回的对象

我对mongoose是新的。 这是我的情况:

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

假设我已经和孩子一起创build了父母'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); } }); 

我需要访问asynchronous函数外的人员对象。 任何想法如何做到这一点?

Mongoose的find()方法是asynchronous的 ,这意味着你应该使用一个callback,你可以从find()方法中包装查询。 例如,在你的情况下,你可以定义一个callback

 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的promise,所以你可以这样做:

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

然后,当你想获得数据,你应该使它asynchronous:

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

你不能在callback之外访问它(=你提到的“asynchronous函数”)。 这就是node.js的工作原理:

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

但是…拥抱asynchronous编程:

  • 只需将所需的所有代码写入“asynchronous函数”
  • 将callback传递给你的函数,从“asynchronous函数”中调用它并传递查询结果