expression/节点,理解渲染模板和asynchronous模型

我有一些麻烦,理解我的应用程序应该如何正确运行加载JSON和渲染模板方面。

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

  1. 我在浏览器中打开我的路线(tools.js开始从外部API中收集JSON)
  2. 模板呈现,并且tools.js调用的结果仍然是未定义的
  3. tools.js刚刚结束加载,在控制台显示正确的数据,但模板已经呈现未定义的结果。

我希望这是有道理的。 我明白,这是一个预期的行为,但是如何在从tools.js获取数据之后“重新呈现”模板?

你需要做这样的事情:

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

您需要在获取数据后呈现模板。 所以,你等待callback或承诺从你的asynchronous获取数据,并在callback,一旦你有数据,你可以然后呈现你的模板。

如果你发布你的代码,我们可以更具体地帮助。

节点路由handers被devise为asynchronous。 直到你明确地告诉他们你已经完成了对响应对象的适当函数调用,这样他们可以在asynchronous获取数据完成后的一段时间内完成,然后将数据与模板结合起来,然后告诉你完成的响应对象。