递归NodeJS HTTP请求失败直到成功

时间:2017-05-02 21:03:58

标签: node.js proxy requestjs

我正在尝试使用crawlera构建网络抓取工具。我对此有点新,所以我尝试创建一个包装函数:

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.')

上述操作有时会导致代理错误超时。所以,当发生这种情况时,我想再次重试请求,直到成功发生,然后继续.then链接,但第19行没有达到此目的。

1 个答案:

答案 0 :(得分:0)

我认为你应该改变第19行

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

当在链中调用函数时,上下文已更改,您应该将其绑定到origin crawlera对象。

我不知道你为什么要在第16行crawlera.count -= 1中添加它。

删除它并更改第19行后,效果很好。