如何在 Mongoose/Node 中同时渲染多个变量?

Posted

技术标签:

【中文标题】如何在 Mongoose/Node 中同时渲染多个变量?【英文标题】:How do you best render multiple variables at the same time in Mongoose/Node? 【发布时间】:2021-05-23 01:58:00 【问题描述】:

我对编程比较陌生,我的第一个大项目是使用 Mongoose 和 Node.js 创建一个网站。

我的问题是如何同时为 ejs 渲染两个变量,而不会因尝试渲染尚未完全执行的查询而引发错误?我显然会在整个帖子中解释。

当主页被请求时,我试图从我的数据库中检索特定文档,并使用 ejs 将它们呈现给用户,如下面的代码所示:

let brandsToBeSent;
let postsToBeSent;
app.get("/", function(req, res)
  Category.find(categoryName: "Featured", function(err, featuredPosts)
    if (!err)
      Brand.find(_id: featuredPosts[0].categoryProducts, function(error, brands)
        if (!error)
          brandsToBeSent = brands;
         else 
          console.log(error);
        
      );
     else 
      console.log(err);
    
  )
  Brand.find(, function(err, allPosts)
    if (!err)
      postsToBeSent = allPosts;
     else 
    console.log(err);
    
  );

res.render("home", featuredposts: brandsToBeSent, siteposts: postsToBeSent);

);

当服务器已经加载时,一切正常!但是,重启服务器(控制台中的 rs)并重新加载页面后,会出现一个简短的错误。我将错误复制如下:

TypeError: /Users/rsouthward/Desktop/Prototypev1.00/views/home.ejs:5
    3| <%-include("navbar")%>
    4| <%-include("graphics")%>
 >> 5| <%-include("featured", featured: featuredposts)%>
    6| <%-include("products", siteposts: siteposts)%>
    7| <%-include("scripts") %>
    8| 

/Users/rsouthward/Desktop/Prototypev1.00/views/featured.ejs:15
    13| <!-- Start -->
    14| 
 >> 15| <% featured.forEach(function(post) %>
    16|   <% var imageconcat = "" %>
    17|   <% for (image of post.brandImageURL) %>
    18|     <% imageconcat += image %>

Cannot read property 'forEach' of undefined

但是,半秒后刷新页面后,页面呈现得非常好。我的猜测是,因为我检索“精选帖子”的查询实际上是两个嵌套的查询,它需要更长的时间,并将在查询检索“站点帖子”后执行。 如果是这种情况,将所有内容一次发送给客户端的最佳方式是什么?我应该使用异步吗? .then() 语句?

我正在阅读有关 async、.then() 和 .exec() 的 Mongoose 文档,但我并不完全理解它们,但以下代码是我解决问题的尝试,它确实有所帮助。

app.get("/", function(req, res)
  res.render("home", featuredposts: brandsToBeSent, siteposts: postsToBeSent);
  Category.find(categoryName: "Featured").exec().then(function(featuredPosts)
    Brand.find(_id: featuredPosts[0].categoryProducts, function(error, brands)
        brandsToBeSent = brands;
    );
  ).then(Brand.find().exec().then(function(allPosts)
    postsToBeSent = allPosts
  )).then(res.render("home", featuredposts: brandsToBeSent, siteposts: postsToBeSent))
)

我的 ejs 和其他服务器的东西似乎很好,但如果我应该附加任何其他代码,请告诉我。这是我的第一篇 *** 帖子,如果我做错了什么,非常抱歉,并提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

使用 async await 语法会让事情变得更容易, 这也是我的第一个 *** 答案:) 所以如果有什么不清楚的地方问我

app.get("/", async function(req, res) 
  try 
    let featuredPosts = await Category.find(categoryName: "Featured");
    let brandsToBeSent = await Brand.find(
      _id: featuredPosts[0].categoryProducts);

    let postsToBeSent = await Brand.find();
    res.render("home", 
      featuredposts: brandsToBeSent, siteposts: postsToBeSent);

   catch (error) 
    console.log(error)
  


);

【讨论】:

以上是关于如何在 Mongoose/Node 中同时渲染多个变量?的主要内容,如果未能解决你的问题,请参考以下文章

在画布中同时渲染精灵表中的多个部分?

如何让 node.js 使用 mongoose 连接到 mongolab

使用 mongoose(Node.js) 在 MongoDB 中搜索

Mongoose/Node:将元素推入数组类型的文档字段?

如何使用正交项目将 3d 渲染图像(透视项目)绘制回另一个视口。同时使用多个视口和 OpenGL [关闭]

如何在 swift 中同时使用多个 xmlparsers?