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?
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