findOne()的Mongoose (express, node, mongo)作用域问题



我有一个问题,我认为是一个变量在mongoose的范围。我的代码是:

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只是一个要加载到集合中的对象数组。我已经搜索了所有类似的答案,但我还没有找到一个正确的答案来解释这一点。

调用Blog.find()时,blogUserId未设置。你必须用不同的方式嵌套它,像这样:

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);
      }
    });
  });
});

我没有测试过,所以我不确定你的代码中是否有其他错误,但绝对是一个问题,你正在调用Blog.find,期望blogUserIdUser.findOne回调中设置之前可能被设置。

可以使用命名回调以更可读的方式编写。

在Node中工作时,您需要记住您是在异步环境中工作。

相关内容

  • 没有找到相关文章

最新更新