2016-08-06 8 views
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) 

ある試みの大半は成功するが、時にはプログラムが停止しました。応答がないときはどうすれば対応できますか?リクエストを放棄してもう一度やり直す方法はありますか?

+0

エラーを処理してタイムアウトを実装する必要があります。いずれかで、そのページを再試行してスキップして続ける回数を決める必要があります。 – jfriend00

答えて

1

errが設定されている場合、またはres.statusCode !== 200のいずれかの場合は、callbackに電話していません。

関連する問題