我正在尝试制作多个HTTP请求并累积,使用以下代码在NodeJS中显示结果:
const async = require('async');
const request = require('request');
function httpGet(url, callback) {
const options = {
url : url,
json : true
};
request(options,
function(err, res, body) {
console.log("invoked")
callback(err, body);
}
).on('error', function(err) {
console.log(err)
});
}
const urls= [
"http://1.2.3.4:30500/status/health/summary",
"http://5.6.7.8:30505/status/health/summary"
];
async.map(urls, httpGet, function (err, res){
if (err)
console.log(err);
else
console.log(res);
});
这里的问题是,如果第一个请求(http://1.2.3.4:30500/status/health/summary)失败(如拒绝连接等),则第二个请求不会通过。我知道我犯了一个愚蠢的错误,却找不到它。任何帮助赞赏!
答案 0 :(得分:2)
在async.map中,如果其中一个调用将错误传递给其回调,则会立即调用主回调(对于map函数)(这是您的问题)。为了不在第一个错误上终止,请不要在httpGet中使用err param调用回调。
每次使用async,它接收一个参数列表和一个函数,并用每个元素调用函数,确保在你的httpGet内部出错,你调用回调,没有错误,这将使其余的调用即使某些调用出错,也会继续。这也可以用于map,但是,我认为更合适的函数是async.each,而不是map,你也可以使用eachLimit方法限制并发调用的数量。
检查https://caolan.github.io/async/docs.html#each
const async = require('async');
const request = require('request');
function httpGet(url, callback) {
const options = {
url : url,
json : true
};
request(options,
function(err, res, body) {
if (err){
console.log(err);
callback();
return;
}
console.log("invoked")
callback(null, body);
}
).on('error', function(err) {
console.log(err);
callback();
});
}
const urls= [
"http://1.2.3.4:30500/status/health/summary",
"http://5.6.7.8:30505/status/health/summary"
];
async.each(urls, httpGet, function (err, res) {
}, function (err, res) {
});
答案 1 :(得分:0)
如果您希望async.map
不要快速失败,您可以这样做
const async = require('async');
const request = require('request');
function httpGet(url, callback) {
const options = {
url : url,
json : true
};
request(options,
function alwaysReportSuccess(err, res, body) {
callback(null, {
success: !err,
result: err ? err : body
});
}
).on('error', function(err) {
console.log(err)
});
}
const urls= [
"http://1.2.3.4:30500/status/health/summary",
"http://5.6.7.8:30505/status/health/summary"
];
async.map(urls, httpGet, function alwaysOk(_, res){
console.log(res); // will be an array with success flags and results
});