NodeJSasynchronous – 即使有一些失败,仍继续执行多个http请求

我试图做出多个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 )失败(如连接拒绝等),第二个请求不通过。 我知道我犯了一个愚蠢的错误,但找不到它。 任何帮助感激!

在async.map中,如果其中一个调用将错误传递给它的callback函数,则主callback函数(对于map函数)会立即被调用并返回错误(这是您的情况)。 为了不结束第一个错误,不要在你的httpGet中用err param调用callback函数。

每次使用asynchronous,它接收参数和函数的列表,并调用与每个元素的函数,确保在你的httpGet里面你错误地调用callback,没有err,这将使其余的调用继续,即使有些电话有错误。 这也可以为地图工作,但是,我认为你的情况更适合的function是async.each,而不是地图,也可以限制并发呼叫的数量与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) { }); 

如果你希望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 });