Рекурсивный NodeJS HTTP-запрос на сбой до успеха
Я пытаюсь построить веб-скребок, используя 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.')
Приведенная выше операция иногда получает тайм-аут ошибки прокси. Поэтому, когда это происходит, я хочу в значительной степени повторить запрос еще раз, пока не произойдет успех, а затем продолжить работу по цепочке.hen, но строка 19 не достигает этого.
1 ответ
Я думал, что вы должны изменить строку 19
crawlera.get(url);
в crawlera.get.call(crawlera, url);
Когда функция вызывается в цепочках, контекст меняется, вы должны привязать ее к исходному объекту обхода контента.
И я не знаю, почему вы добавляете это в строке 16 crawlera.count -= 1
,
После удаления и изменения строки 19 все работает хорошо.