【问题标题】:Mongoose (express, node, mongo) scope issue with findOne()findOne() 的 Mongoose (express, node, mongo) 范围问题
【发布时间】:2017-02-07 23:54:00
【问题描述】:

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

【问题讨论】:

    标签: node.js mongodb mongoose mean-stack


    【解决方案1】:

    当您的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 的问题,它期望 blogUserId 可能在设置之前设置在User.findOne 回调中。

    它可以通过命名回调以更易读的方式编写。

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

    【讨论】:

    • 谢谢,就是这样,无论如何,这种结构更有意义
    猜你喜欢
    • 2014-11-25
    • 2011-09-03
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多