如何将填充的Mongoose对象传递给渲染代码?

在我的routes.js文件的以下代码中,我可以成功地在一个名为Map的Mongoose对象中填充一些ref。 当我查看页面时,控制台将打印popmapeditor对象的完全填充版本。

  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

问题是你正在编写Mongoose代码,就好像它是同步的,但是你需要在运行callback函数里面调用res.render,因为这是执行查询的时候。 在你的例子中,渲染函数会在查询返回结果之前被调用。

除此之外,您可以将popmapvariables作为局部variables传递给视图:

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

请注意,填充任务是asynchronous的,当任务完成时,将在结果上调用callback函数。 在此之前,填充的地图将不可用。

因此,您需要做的是将渲染步骤放在callback函数中。

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