2014-02-13 28 views
1

我在加載正確的表時遇到了一些麻煩,因爲在所有信息傳遞到我的ejs模板之前加載頁面。對所有這些都很新穎,並會感謝任何幫助!nodejs/express/mongo res.render等到數據庫搜索完成後才加載

我應該注意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')}); 
    }); 
}); 

Profile.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 %> 

這種類型的設置爲我工作的另一個頁面上,我不能讓它工作在這裏。謝謝!

回答

0

在加載信息之前呈現頁面的原因是因爲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(這是什麼,似乎你要在給定回調)

相關問題