Mongodb / Express / Handlebars有res.render等到数据被拉出后

时间:2015-07-21 15:28:57

标签: node.js mongodb express

似乎res.render在从mongodb中提取数据之前加载。无论如何都有这个。

app.use('/portfolio/:item_id', function(req, res, next) {
portfolioItem.findOne({ projectID : req.params.item_id}, function (err, item){
    if (err) return handleError(err);
    if (item) {
        res.locals = {
            script: ['isotope.js'],
            title: item.projectTitle,
             projectID: item.projectID,
             projectTitle: item.projectTitle,
             projectDescription: item.projectDescription,
             projectURL: item.projectURL,
             customerName: item.customerName,
             websiteCategories: item.projectCategories,
             grid: item.grid
        }
    }}); 
    res.render('case_study'); 

});

作为旁注,我也在使用车把。

1 个答案:

答案 0 :(得分:2)

正如snozza在评论中提到的那样,res.render必须在findOne回调中。

这是由于Node.js以及它是异步操作的。它同时运行两个函数,并且不会等待来自MongoDB调用的数据返回。在findOne函数本身中,代码是同步运行的,因此在第二个if语句之后放置res.render将解决问题。

app.use('/portfolio/:item_id', function(req, res, next) {
  portfolioItem.findOne({ projectID : req.params.item_id}, function (err, item){
    if (err) return handleError(err);
    if (item) {
      res.locals = {
        script: ['isotope.js'],
        title: item.projectTitle,
        projectID: item.projectID,
        projectTitle: item.projectTitle,
        projectDescription: item.projectDescription
        projectURL: item.projectURL 
        customerName: item.customerName,
        websiteCategories: item.projectCategories,
        grid: item.grid
      }
      res.render('case_study'); 
    }
  }); 
});