表达/节点,理解渲染模板和异步模型

时间:2014-09-30 05:08:18

标签: node.js asynchronous express

我在理解应用程序在加载JSON和呈现模板方面应该如何正确运行时遇到了一些麻烦。

想象一下有路由仪表板,我想从外部API收集一些数据。我创建了自定义文件(tools.js),我有一个从(https.request(options, function(res)) {...})编写的源中获取数据的函数,所以基本上过程如下:

  1. 我在浏览器中打开我的路线(tools.js开始从外部API收集JSON)
  2. 模板渲染,tools.js调用的结果仍未定义
  3. tools.js刚刚结束加载,在控制台中显示正确的数据,但模板已经呈现未定义的结果。
  4. 我希望这是有道理的。我明白,这是一种预期的行为,但我怎样才能重新呈现"从tools.js获取数据后的模板?

2 个答案:

答案 0 :(得分:2)

你需要做这样的事情:

tools.js:

var https = require('https');

var options = ...

exports.getData = function(cb) {
  var done = false;
  function errorHandler(err) {
    if (!done) {
      done = true;
      cb(err);
    }
  }
  https.request(options, function(res) {
    var buf = '';
    res.setEncoding('utf8');
    res.on('data', function(d) {
      buf += d;
    }).on('end', function() {
      if (!done) {
        done = true;
        var ret;
        try {
          ret = JSON.parse(buf);
        } catch (ex) {
          return errorHandler(ex);
        }
        cb(null, ret);
      }
    }).on('error', errorHandler);
  }).on('error', errorHandler).end();
};

路线:

var getData = require('./tools').getData;

// ...

app.get('/json', function(req, res) {
  getData(function(err, data) {
    if (err) return res.send(500);
    res.render('mytemplate', { jsondata: data });
  });
});

答案 1 :(得分:0)

您需要在获得数据后呈现模板。因此,您等待异步提取数据的回调或承诺,并在该回调中,一旦获得数据,您就可以渲染模板。

如果您发布代码,我们可以提供更具体的帮助。

节点路由处理程序设计为异步。它们没有完成,除非您明确地告诉他们您已经完成了对响应对象的相应函数调用,以便他们可以在您异步提取数据完成后的某个时间内完成,您将数据组合起来使用您的模板,然后告诉响应对象您已完成。