2017-05-02 6 views
0

Ich versuche, einen Web-Scraper mithilfe von crawlera zu erstellen. Ich bin ein bisschen neu in diesem und so habe ich versucht, eine Wrapper-Funktion zu erstellen:Rekursive NodeJS-HTTP-Anforderung bei fehlgeschlagenem Erfolg

const request = require('request') 

var crawlera = { 
    apikey: 'asdfasdfasdfasdf', 
    limit : 10, 
    count : 0 
} 

crawlera.get = (url) => { 
    console.log('count: ' + crawlera.count + ' limit: ' + crawlera.limit) 
    var promise 
    if(crawlera.count < crawlera.limit){ 
     promise = new Promise((resolve, reject) =>{ 
     let options = {url: url, proxy: 'http://'+crawlera.apikey+':@proxy.crawlera.com:8010', "rejectUnauthorized": false} 
      request(options, (err, res, html) => { 
       crawlera.count -= 1 
       if (err) { 
        console.log('Proxy Error. Retrying..') 
        crawlera.get(url) 
       } else{ 
        console.log('Crawlera: ' + url) 
        results = {} 
        results.html = html 
        results.url = options.url 
        resolve(results); 
       }    
      }) 
      crawlera.count+=1 
     }) 
     return promise 
    } else{ 
     return Promise.resolve('concurrency count maxed') 
    } 
} 

module.exports = crawlera 

Was ich dann mit meiner Haupt-App aufrufen.

crawlera.get('http://someurl').then(res => console.log('do something with the result.') 

Die obige Operation ruft manchmal ein Proxyfehler-Timeout ab. Wenn das passiert, möchte ich die Anfrage so oft wiederholen, bis ein Erfolg eintritt, und dann die Abwärtskette fortsetzen, aber Zeile 19 erreicht dies nicht.

+0

Ähnliche Antworten: [Promise Retry Design Patterns] (http://stackoverflow.com/questions/38213668/promise-retry-design-patterns/38214203#38214203) und [Promise Retry Step] (http: // stackoverflow. com/fragen/37993365/retry-a-Versprechen-Schritt/37995874 # 37995874). – jfriend00

Antwort

0

Ich dachte, Sie Linie 19

crawlera.get(url); zu crawlera.get.call(crawlera, url);

Wenn die Funktion in Ketten genannt ändern sollte, Kontext geändert hat, können Sie es auf den Ursprung crawlera Objekt binden sollte.

Und ich weiß nicht, warum Sie dies in Zeile 16 crawlera.count -= 1 hinzufügen.

Nach dem Entfernen und ändern Sie Zeile 19, es funktioniert gut.

Verwandte Themen