2016-08-06 10 views
0

Ich möchte einige Ressourcen von einer Website speichern, die Ressourcen sind mit vielen Seiten getrennt, so muss ich Anfrage Seite für Seite senden. Die Seiten sind über 1000+, ich habe async.eachSeries für stabilen Fluss verwendet. Manchmal sendet das Anforderungsmodul jedoch keine Antwort, sodass ein Programm beim Ausführen gestoppt wird.Wie behandelt man keine Antwort von Node.js Request-Modul?

Unten finden Sie den Code ein,

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(); 

      }); 
     } 
    }) 
} 

Die Konsole

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) 

meisten Versuch erfolgreich ist, aber manchmal Programm gestoppt. Wie kann ich mit keiner Antwort umgehen? Gibt es eine Möglichkeit, die Anfrage abzubrechen und es erneut zu versuchen?

+0

Sie müssen beide Fehler behandeln und ein Timeout implementieren. Bei beiden müssen Sie entscheiden, wie oft Sie diese Seite wiederholen oder überspringen und weitermachen möchten. – jfriend00

Antwort

1

Zum einen rufen Sie nicht Ihren callback an, wenn entweder err eingestellt ist oder wenn der res.statusCode !== 200.

Verwandte Themen