Mongoose(express,node,mongo)范围问题findOne()

我有一个问题,我相信是mongoosevariables的范围。 我的代码是这样的:

var blogUserId; blogs.forEach(function(blog, index) { User.findOne({'username': blog.username}, function(err, user) { blogUserId = user._id; console.log(blogUserId); }); console.log(blogUserId); Blog.find({'title': blog.title}, function(err, blogs) { if (!err && !blogs.length) { console.log(blogUserId); Blog.create({title: blog.title, author: blogUserId, body: blog.body, hidden: blog.hidden}); } if (err) { console.log(err); } }); }); 

这是一个种子文件的一部分,只是为了开发,但我很困惑,为什么它不会工作。 blogs只是要加载到集合中的一组对象。 我已经search了所有类似的答案,但我还没有find一个正确的答案,可以解释这一点。

当你的Blog.find()被调用时,你的Blog.find()没有设置。 你必须以不同的方式嵌套,像这样:

 var blogUserId; blogs.forEach(function(blog, index) { User.findOne({'username': blog.username}, function(err, user) { blogUserId = user._id; console.log(blogUserId); Blog.find({'title': blog.title}, function(err, blogs) { if (!err && !blogs.length) { console.log(blogUserId); Blog.create({title: blog.title, author: blogUserId, body: blog.body, hidden: blog.hidden}); } if (err) { console.log(err); } }); }); }); 

我没有testing它,所以我不知道你的代码中没有其他错误,但肯定是一个问题,你打电话给Blog.find ,期望blogUserId可能被设置之前,它被设置在User.findOne回电话。

它可以用更具可读性的方式用命名的callback来书写。

在Node中工作时,需要记住您正在asynchronous环境中工作。