複数の 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 ) が失敗した場合 (接続が拒否されたなど)、2 番目のリクエストが通過しないことです。ばかげた間違いをしていることはわかっていますが、それを見つけることができません。助けていただければ幸いです!
async.map では、呼び出しの 1 つがそのコールバックにエラーを渡した場合、メインのコールバック (map 関数用) がエラーですぐに呼び出されます (これがこの場合の問題です)。最初のエラーで終了しないようにするには、httpGet で err param を使用してコールバックを呼び出さないでください。
async each を使用し、引数のリストと関数を受け取り、各要素で関数を呼び出します。エラー時に httpGet 内でコールバックを呼び出すようにしてください。一部の通話でエラーが発生しました。これは map でも機能しますが、あなたのケースに適した関数は map の代わりに 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) {
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加