【问题标题】:How do I pass a populated Mongoose object to the rendering code?如何将填充的 Mongoose 对象传递给渲染代码?
【发布时间】:2012-01-04 06:06:45
【问题描述】:

在我的 routes.js 文件中的以下代码中,我可以成功地在名为 Map 的 Mongoose 对象中填充一些引用。当我查看页面时,控制台会打印完全填充的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

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    问题是您正在编写 Mongoose 代码,就好像它是同步的一样,但是您需要在 run 回调函数中调用 res.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
        });
      });
    });
    

    【讨论】:

      【解决方案2】:

      注意填充任务是异步的,当任务完成后,回调函数会被调用。在此之前,填充的地图将不可用。

      因此,你需要做的是将渲染步骤放在回调函数中。

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

      【讨论】:

      • 感谢您的解释。两个答案都是正确的。
      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 2017-09-13
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多