在我的routes.js文件的以下代码中,我可以在一个名为Map
的Mongoose对象中成功填充一些引用。当我查看页面时,控制台会打印完全填充的popmap
editor
个对象版本。
app.get('/map/:id', function(req, res){
Map
.findOne({ _id: req.map._id })
.populate('_editors')
.run(function (err, popmap) {
console.log('The editors are %s', popmap._editors);
});
res.render('maps/show', {
title: req.map.title,
map: req.map
});
});
但是,我还没想到如何执行填充步骤,使得结果对象仍然在渲染代码的范围内。换句话说,如何将填充的对象传递给Jade模板而不是仅发送req.map
?
答案 0 :(得分:6)
问题是你正在编写Mongoose代码,好像它是同步的,但你需要在运行回调函数中调用res.render,因为那是在查询执行时。在您的示例中,将在查询返回结果之前调用render函数。
除此之外,您可以将popmap
变量作为局部变量传递给视图:
app.get('/map/:id', function(req, res){
Map
.findOne({ _id: req.map._id })
.populate('_editors')
.run(function (err, popmap) {
console.log('The editors are %s', popmap._editors);
res.render('maps/show', {
title: req.map.title,
map: req.map,
popmap: popmap // you can access popmap in the view now
});
});
});
答案 1 :(得分:3)
请注意,填充任务是异步的,当任务完成时,将在结果上调用回调函数。在此之前,填充的地图将不可用。
因此,您需要做的是将渲染步骤放在回调函数中。
app.get('/map/:id', function(req, res){
Map
.findOne({ _id: req.map._id })
.populate('_editors')
.run(function (err, popmap) {
console.log('The editors are %s', popmap._editors);
res.render('maps/show', {
title: popmap.title,
map: popmap
});
});
});