我还在学习Node.js和Moongoose的阶段,我有一个场景在
我的逻辑:
article.owner = User.findOne({ 'name' : 'ABC' })
.exec(function (err, user){
return user
})
但它没有返回结果。我提到了其他一些答案并试了async.parallel
但是我仍然无法在article.owner
的文章架构中保存ABC用户的objectID。我总是得到空。
请建议我任何其他更好的方法。
答案 0 :(得分:3)
当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
});
答案 1 :(得分:1)
User.findOne({ 'name' : 'ABC' }) .exec(function (err, user){
article.owner = user.fieldName;
})
答案 2 :(得分:1)
hexacyanide的答案显示了如何通过另一个回调从异步数据库查找回调中传输数据。保存我的项目!