使用异步和请求包(NodeJS / Express)进行多个 API 调用
Posted
技术标签:
【中文标题】使用异步和请求包(NodeJS / Express)进行多个 API 调用【英文标题】:Multiple API calls with Async & Request Package (NodeJS / Express) 【发布时间】:2017-11-14 10:17:06 【问题描述】:我正在尝试在我的一个路由器中将异步和请求实现为异步 API 请求操作。终点只是一个查询字符串,我试图返回一个包含所有调用结果的数组或对象。到目前为止只有两个:
router.get('/', function(req, res)
async.parallel([
function(next)
request(queryString + 'end point string', function(error, response, body)
if (!error && response.statusCode == 200)
var unsPAM = JSON.parse(body);
;
console.log(error);
);
,
function(next)
request(queryString + 'end point string', function(error, response, body)
if (!error && response.statusCode == 200)
var unsAll = JSON.parse(body);
;
console.log(error);
);
],
function(err, results)
res.render("api-results", [results]);
);
);
这正是我想要做的。如果我在请求后 console.log 每个变量的结果它可以正常工作,但没有返回任何内容并且我的 ejs 模板没有被提供。
我也尝试过以各种格式(数组/对象形式)使用类似下面的东西,但我似乎无法让它工作:
res.render("api-results", unsPAM: unsPAM, unsAll: unsAll );
我认为这是因为请求的结果并没有以某种方式进入异步数组。任何建议/最佳实践解决方案/想法改变将不胜感激。
谢谢。
【问题讨论】:
【参考方案1】:在每个函数中,您需要使用null
和要传递的值调用next()
回调,如果不成功,则需要调用error
对象。没有它,async.parallel()
没有任何迹象表明 API 调用已经完成。
为了减少重复代码的数量,您可以为每个 API 端点创建一个带有 URL 的闭包:
function apiCall(url)
return function(callback)
request(url, function(error, response, body)
if (error || response.statusCode != 200)
return callback(error);
try
return callback(null, JSON.parse(body));
catch (error)
return callback(error);
);
;
router.get('/', function(req, res)
async.parallel([
apiCall(queryString + 'end point string'),
apiCall(queryString + 'end point string')
], function(err, results)
if (err) console.log(err);
res.render("api-results", results);
);
);
这将调用res.render()
和results
作为[unsPAM, unsAll]
。如果您希望 results
成为具有键 unsPAM
和 unsAll
的对象,请使用对象而不是数组作为第一个参数调用 async.parallel()
:
router.get('/', function(req, res)
async.parallel(
unsPAM: apiCall(queryString + 'end point string'),
unsAll: apiCall(queryString + 'end point string')
, function(err, results)
if (err) console.log(err);
res.render("api-results", results);
);
);
【讨论】:
以上是关于使用异步和请求包(NodeJS / Express)进行多个 API 调用的主要内容,如果未能解决你的问题,请参考以下文章
使用nodejs和rest api调用和express进行异步处理-序列错误