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

标签 javascript node.js mongodb express mongoose

我在正确加载此表时遇到一些问题,因为页面是在所有信息传递到我的 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/

相关文章:

javascript - bootstrap 列上的 ngFor 和 ngIf

javascript - iframe.contentWindow.document Chrome 替代品?

javascript - 带有 'element' 嵌入的 Angular 模板

node.js - Gulp-sass 在包含的文件中找不到变量?

javascript - 在运行时定期更改 HTML 正文的内容 - NodeJS

java - MongoDB Java 拉取

mongodb - 哪个更适合Mongo : empty field or no field at all?

javascript - JQuery 选择更改选项不显示值

javascript - 在node.js中使用nodemailer模块时无法识别变量的属性

sql - MongoDB:如何检索新构造的数据而不是集合中的原始文档?