0
私はいくつかのリソースをウェブサイトから保存したい、リソースは多くのページで分けられているので、ページごとにリクエストを送信する必要があります。ページは1000+以上で、安定したフローのためにasync.eachSeries
を使用しました。しかし、リクエストモジュールがレスポンスを送信しない場合があるため、プログラムの実行中に停止します。以下はNode.jsリクエストモジュールの応答を処理する方法は?
コード、
var pages = [1, 2, 3, 4, 5, 6, .... , 200];
async.eachSeries(pages, function (page, callback) {
getData(page, function(){
console.log('Data saved . page : ' + page);
callback();
});
}, function() {
console.log('All done !');
});
function getData(page, callback) {
//request data
var url = "http://finance.naver.com/item/frgn.nhn?code=191420&page="+page;
request(url, function (err, res, html) {
if (!err && res.statusCode == 200) {
var $ = cheerio.load(html);
var data = $.html();
// save to mongoDB
new Data({
data: data,
}).save(function (err, result) {
if (err) console.log('Error !');
// callback here, to async.eachSeries() knows;
callback();
});
}
})
}
コンソール
Data saved. page : 1
Data saved. page : 2
Data saved. page : 3
Data saved. page : 4
Data saved. page : 5
Data saved. page : 6 (stopped here with no progress, sometimes)
ある試みの大半は成功するが、時にはプログラムが停止しました。応答がないときはどうすれば対応できますか?リクエストを放棄してもう一度やり直す方法はありますか?
エラーを処理してタイムアウトを実装する必要があります。いずれかで、そのページを再試行してスキップして続ける回数を決める必要があります。 – jfriend00