我正在尝试创建一个从API请求某些数据的简单应用。我用express构建它,我有以下代码来执行请求:
module.exports = {
getPrevMatches: function(){
request({
uri: 'http://worldcup.sfg.io/matches',
json: true
}, this.process);
},
process: function(error, response, body){
if(response.statusCode === 200){
return body;
}
}
}
以下是我的快递脚本:
app.get('/previous', function (req, res){
var prevMatches = worldcup.getPrevMatches();
console.log(prevMatches);
res.render('prev.html', {
prevMatches: prevMatches
});
});
此时,prevMatches始终未定义。我认为请求包会等到请求完成后再继续我的代码。情况不是这样吗?
感谢。
答案 0 :(得分:2)
使用基于回调的方法(如评论中所述):
function getPrevMatches(cb) {
request({
uri: 'http://worldcup.sfg.io/matches',
json: true
}, function(error, response, body){
if (response.statusCode === 200){
cb(body);
}
// Do error handling here!
});
}
module.exports = {
getPrevMatches: getPrevMatches
}
如您所见,无需导出过程功能。调用代码现在变为:
app.get('/previous', function(req, res){
worldcup.getPrevMatches(function(prevMatches) {
console.log(prevMatches);
res.render('prev.html', {
prevMatches: prevMatches
});
});
});
第一句话:您仍然需要处理请求调用中的错误(添加为注释)。
第二句话:您可能希望采用基于Promise的方法来避免回调地狱。 Request有一个非常好的基于promises的包装器,方便地称为request-promise
答案 1 :(得分:1)
这是承诺的一个很好的用例。 有很多库,例如你可以使用https://www.npmjs.com/package/request-promise。
var rp = require('request-promise');
module.exports = {
getPrevMatches: function(){
return rp({
uri: 'http://worldcup.sfg.io/matches',
json: true
});
}
}
我不确定this.process
是否可以在此上下文中使用
app.get('/previous', function (req, res){
var prevMatches = worldcup.getPrevMatches();
prevMatches.then(function (data) {
console.log(data);
res.render('prev.html', {
prevMatches: data
});
})
prevMatches.catch(function (e) {
res.status(500, {
error: e
});
});
});