gpt4 book ai didi

javascript - nodejs/express/mongo 让 res.render 等到数据库搜索完成后加载

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:33 25 4
gpt4 key购买 nike

我在正确加载此表时遇到一些问题,因为页面是在所有信息传递到我的 ejs 模板之前加载的。对这一切都很陌生,希望得到任何帮助!

我应该注意到,owneditems 是用户架构中的 ID 数组。

routes.js:

app.get('/profile/:username', function(req, res) {
User.findOne({username: req.params.username}, function(err, user) {
var newDocs = [];
if (!user) {
req.flash('profilemessage', 'No such user exists.');
} else {
user.owneditems.map(function(i) {
Items.findById(mongoose.Types.ObjectId(i), function(err, idoc) {
newDocs.push("<tr><td>" + idoc.name + "</td><td>" + idoc.brand</td></tr>");
});
});
}
res.render('profile.ejs', {title: 'Profile', items: newDocs, message: req.flash('profilemessage')});
});
});

配置文件.ejs:

<!-- content -->
<div class="wrapper row2">
<div id="container" class="clear">
<section>
<% if (message) { %>
<h4><%= message %></h4>
<% } %>
<table id="owneditems" class="sortable">
<tr><th>Name</th><th>Brand</th></tr>
<% for(var i=0; i<items.length; i++) {%>
<%- items[i] %>
<% } %>
</table>
</section>
</div>
</div>

<% include layoutBottom %>

这种类型的设置在另一个页面上适用于我,但我只是无法在此处使用它。谢谢!

最佳答案

之所以在信息加载之前渲染页面,是因为Items.findById是异步的。这意味着 newDocs 在传递给 res.render 时不会返回您期望的项目数组。

当你想用 Mongoose 加载子文档(数组)时,最好使用 query#populate 。此方法允许您一次性将 user.owneditems 数组中的项目 ID 替换为实际项目文档。

我认为这适用于您的情况:

app.get('/profile/:username', function(req, res) {
User.findOne({username: req.params.username})
.populate('owneditems')
.exec(function(err, user) {
var newDocs = [];
if (!user) {
req.flash('profilemessage', 'No such user exists.');
} else {
user.owneditems.forEach(function(i) {
newDocs.push("<tr><td>" + i.name + "</td><td>" + i.brand</td></tr>");
});
}
res.render('profile.ejs', {title: 'Profile', items: newDocs, message: req.flash('profilemessage')});
});
});

另请注意,我使用 forEach 切换了 map (鉴于您的回调,这似乎是您想要的)

关于javascript - nodejs/express/mongo 让 res.render 等到数据库搜索完成后加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21766054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com