我仍处于Node.js和Moongoose的学习阶段,并且有一个场景
我的逻辑:
article.owner = User.findOne({ 'name' : 'ABC' })
.exec(function (err, user){
return user
})
但这并没有返回结果。我引用了其他一些答案并尝试过,async.parallel
但仍然无法将ABC用户的objectID保存在文章模式中,因为article.owner
我总是变得空。
请建议我其他更好的方法。
当Node必须执行任何I / O(例如从数据库读取)时,它将异步完成。像User.findOne
和这样的方法Query#exec
永远不会预先返回结果,因此article.owner
在您的示例中不会适当地未定义。
异步查询的结果仅在您的回调内部可用,只有在您的I / O完成后才调用该回调
article.owner = User.findOne({ name : 'ABC' }) .exec(function (err, user){
// User result only available inside of this function!
console.log(user) // => yields your user results
})
// User result not available out here!
console.log(article.owner) // => actually set to return of .exec (undefined)
在上面的示例中,异步代码执行的含义是:当Node.js命中时article.owner = User.findOne...
,它将执行User.findOne().exec()
,然后console.log(article.owner)
在.exec
完成之前直接进入。
希望有助于澄清。习惯于花一些时间进行异步编程,但通过更多实践可以理解
更新为解决您的特定问题,一种可能的解决方案是:
User.findOne({name: 'ABC'}).exec(function (error, user){
article.owner = user._id; // Sets article.owner to user's _id
article.save() // Persists _id to DB, pass in another callback if necessary
});
如果要向用户加载以下文章,请记住使用Query#populate:
Article.findOne({_id: <some_id>}).populate("owner").exec(function(error, article) {
console.log(article.owner); // Shows the user result
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句