我正在尝试在我的路由器之一中将异步和请求实现为异步 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 });
我认为这是因为请求的结果没有以某种方式进入异步数组。任何建议/最佳实践解决方案/想法的改变将不胜感激。
谢谢。
最佳答案
在每个函数中,您需要使用 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()
,结果
为 [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);
});
});
关于node.js - 使用异步和请求包进行多个 API 调用 (NodeJS/Express),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44507886/