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

时间:2012-01-04 06:06:45

标签: node.js express mongoose

在我的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

2 个答案:

答案 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
      });
    });
  });
相关问题