我在理解应用程序在加载JSON和呈现模板方面应该如何正确运行时遇到了一些麻烦。
想象一下有路由仪表板,我想从外部API收集一些数据。我创建了自定义文件(tools.js),我有一个从(https.request(options, function(res)) {...}
)编写的源中获取数据的函数,所以基本上过程如下:
我希望这是有道理的。我明白,这是一种预期的行为,但我怎样才能重新呈现"从tools.js获取数据后的模板?
答案 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)
您需要在获得数据后呈现模板。因此,您等待异步提取数据的回调或承诺,并在该回调中,一旦获得数据,您就可以渲染模板。
如果您发布代码,我们可以提供更具体的帮助。
节点路由处理程序设计为异步。它们没有完成,除非您明确地告诉他们您已经完成了对响应对象的相应函数调用,以便他们可以在您异步提取数据完成后的某个时间内完成,您将数据组合起来使用您的模板,然后告诉响应对象您已完成。