2017-05-02 8 views
0

私はクローラを使用してWebスクレーパーを構築しようとしています。私は少しこれが新しいので、ラッパー関数を作成しようとしました:成功するまでの再帰NodeJS HTTPリクエスト

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 

私は私の主なアプリケーションで呼び出します。

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

上記の操作では、プロキシエラーのタイムアウトが発生することがあります。だからこそ、私は、成功が起こるまでリクエストをやり直してからチェーンを続けますが、19行目はこれを達成していません。

+0

関連する回答:[Promise Retry Design Patterns](http://stackoverflow.com/questions/38213668/promise-retry-design-patterns/38214203#38214203)と[Promise Retry Step](http:// stackoverflow。 co.jp/questions/37993365 /再試行 - 約束手続き/ 37995874#37995874)。 – jfriend00

答えて

0

私はあなたがチェーンで呼び出された関数、コンテキストが変更されたとき、あなたは原点crawleraオブジェクトにバインドする必要があり crawlera.get.call(crawlera, url);

にライン19

crawlera.get(url); を変更してくださいと思いました。

これを16行目に追加する理由はわかりません。crawlera.count -= 1

それを削除して19行目を変更した後、正常に動作します。