使用res.render并同时发送json文件

时间:2016-04-06 13:23:13

标签: javascript json node.js mongodb

我有这个快速应用程序,mongoDB作为数据库,把手作为我的服务器端模板引擎。我在我的应用程序中没有使用AngularJS或Ajax。

在其中一个路由中,我必须渲染页面以及从数据库发送json文件。但是,我无法做到这一点。

这是我的路线代码片段:

router.get('/disks', function(req, res, next) {

      var risime;

  places.find({"category": "disks"}, function(err, disk){
      if(err){
        throw err;
      }

      risime= disk;
      console.log(risime);  //PROPERLY LOGS THE OUTPUT

  });

  res.render('diskPage', 
    {
      'disks': risime
    });

});

在hbs中,我试图捕获它,但我没有得到json数据:

  var clrisime= "{{risime}}"
  console.log(clrisime); // DOES NOT LOG ANYTHIN

我该如何实现?

2 个答案:

答案 0 :(得分:5)

你犯了两个简单的错误:

router.get('/disks', function(req, res, next) {

  var risime;

  places.find({"category": "disks"}, function(err, disk){
      if(err){
        throw err;
      }

      risime= disk;
      console.log(risime);  //PROPERLY LOGS THE OUTPUT

      // this belongs inside your db callback
      res.render('diskPage', 
        {
          'disks': risime
          // if you call your field 'disks' here, you need to write {{disks}} in your template
        });
  });


});
  1. 由于您希望在响应中使用数据库结果,因此需要将res.render放入回调中。
  2. 模板内的变量名称和渲染对象的字段名称必须相同。

答案 1 :(得分:1)

您的代码是异步执行的。 这意味着几乎同时执行places.find和res.render(最大约10ms),并且在place.find之前完成渲染。因此,逻辑上你没有渲染中的数据。

您必须将代码的第二部分放在第一个条件(places.find)解析的回调中,如下所示:

router.get('/disks', function(req, res, next) {
  var risime;
  places.find({"category": "disks"}, function(err, disk){
  if(err){
    throw err;
  }
  risime= disk;
  console.log(risime);  //PROPERLY LOGS THE OUTPUT
  res.render('diskPage', 
  {
    'disks': risime
  });
});

如果您在视图中使用{{disks}}而不是{{risime}},它将会有效。