如何在 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 中搜索