Node.js Mongodb/Express/Handlebars具有res.render等待,直到数据被提取

Node.js Mongodb/Express/Handlebars具有res.render等待,直到数据被提取,node.js,mongodb,express,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.local

似乎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'); 
}))


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

正如斯诺扎在评论中提到的,
res.render
必须在findOne回调中

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

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'); 
    }
  }); 
});

res.render需要在findOne回调中