Node.js Mongodb/Express/Handlebars具有res.render等待,直到数据被提取
似乎res.render是在从mongodb提取数据之前加载的。这件事有什么不妥吗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
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回调中