【问题标题】:Using two collection in MongoDB with Mongoose在 Mongoose 中使用 MongoDB 中的两个集合
【发布时间】:2020-04-06 03:52:47
【问题描述】:

我是 NodeJS 的新手,我正在使用以下内容: 表达 猫鼬 护照

您好,我在 MongoDB 中有两个集合,它们彼此无关,它们被称为:

Post

User

在 IF 语句中 /home 的获取路径中,我试图从两个集合中查询信息并将它们呈现在 EJS 页面中。我最初的想法是在 var 中为一个模型存储创建 find,然后在呈现页面时在另一个函数中使用它。

以下是相关代码:

app.get("/home", function(req, res){
  console.log(req.user._id);
  if (req.isAuthenticated()){
    // //*Find current logged in user details
    User.find({_id: req.user._id}, function(err, users){
      var currentUserName = req.user.name
      });

    //*end
    Post.find({}, function(err, posts){
      res.render("home", {
        startingContent: homeStartingContent,
        posts: posts,
        currentUser: currentUserName
        });
    });

  } else {
    res.redirect("login")
  }
});

在我的 js 文件的开头,我已经声明了

var currentUserName

但它没有在 home.ejs 中显示值:

<p><%= currentUser %></p>

它只是空白。

我在这里做错了什么?我认为使用 var 会使其成为全局变量,然后可以在另一个函数中使用?其他帖子建议聚合,但这些集合是完全独立的,彼此无关。

【问题讨论】:

  • 您的问题解决了吗?

标签: node.js mongodb express mongoose


【解决方案1】:

您在User.find(){...} 函数中定义了currentUserName,并且它只能在该函数中访问。您需要在User.find(){...} 函数之外定义可以是块范围的变量。检查下面的代码sn-p:

app.get("/home", function(req, res){
  console.log(req.user._id);
  if (req.isAuthenticated()){
    let currentUserName;
    // //*Find current logged in user details
    User.find({_id: req.user._id}, function(err, users){
      currentUserName = req.user.name
      });

    //*end
    Post.find({}, function(err, posts){
      res.render("home", {
        startingContent: homeStartingContent,
        posts: posts,
        currentUser: currentUserName
        });
    });

  } else {
    res.redirect("login")
  }
});

Javascript 最佳实践告诉我们最好使用let 而不是var。由 var 关键字声明的变量的作用域是直接函数体,即User.find(){...},而 let 变量的作用域是由 {} 表示的直接封闭块,即if(req.isAuthenticated()){...}

【讨论】:

    【解决方案2】:

    它不起作用,因为每个变量都有范围。范围意味着使用该变量的访问权限。在这种情况下,currentUserName 具有范围或只能在User.find() 部分中使用。如果您想在 Post.find() 中使用它,请在 main 函数中声明它,如下所示。

    app.get("/home", function(req, res){
      console.log(req.user._id);
      let currentUserName;
      if (req.isAuthenticated()){
        User.find({_id: req.user._id}, function(err, users){
          currentUserName = req.user.name
          });
    
        Post.find({}, function(err, posts){
          res.render("home", {
            startingContent: homeStartingContent,
            posts: posts,
            currentUser: currentUserName
            });
        });
    
      } else {
        res.redirect("login")
      }
    });
    

    通过在主函数中声明currentUserName,它将按您的要求工作,因此它将在整个主函数app.get() 中使用

    【讨论】:

    • 使用let 比使用var 更好
    • Yes let 在范围表达式中优于 var。感谢您的建议@AymanArif
    猜你喜欢
    • 2020-01-31
    • 2018-09-29
    • 2021-04-22
    • 1970-01-01
    • 2019-08-07
    • 2018-08-21
    • 1970-01-01
    • 2019-01-14
    • 2018-03-24
    相关资源
    最近更新 更多