Я использую Node для приложения React, и я использую модуль Request-Retry, чтобы выполнить некоторые операции с веб-прокси через прокси. Я использую модуль https-proxy-agent для создания нового прокси-агента с подробностями, полученными из API.
В моей среде разработки некоторые подключения к прокси-агенту занимают некоторое время, но тайм-аут шлюза 504 никогда не происходит. Как только я отправляю код в свою промежуточную среду, тайм-аут 504 происходит почти сразу после выполнения запросов прокси.
Я не нашел способа явно установить время ожидания для запросов прокси, кроме добавления заголовка keep-alive и использования свойств времени ожидания для моего запроса и объекта https-proxy-agent. Однако эти тайм-ауты, похоже, не применяются вообще.
Кроме того, я получаю много ошибок ECONNECTREFUSED при попытке отправить прокси-запросы через мою промежуточную среду, которая защищена с помощью HTTPS. Может ли это быть частью проблемы?
Мой код:
const getDomainMeta = ({ domainArr, index }) => {
const url = domainArr[4];
return new Promise((resolve, reject) => {
let headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': '*',
'Accept-Language': 'en-US,en;q=0.9',
};
// Get a proxy
getProxy(index)
.then(proxy => {
let agent = new HttpsProxyAgent({
host: proxy.ip,
port: proxy.port,
headers: headers,
timeout: 5000
});
const retryStrategy = (err, resp, body) => {
if(!err) {
console.log('No need for new proxy. Return false.');
return false;
}
console.log('Retry for site ' + index);
getProxy(index)
.then(proxy => {
agent = new HttpsProxyAgent({
host: proxy.ip,
port: proxy.port,
headers: headers
})
options.agent = agent;
console.log('Got new proxy');
console.log(proxy.ip);
return 1;
})
.catch(err => console.log({ err }));
}
let options = {
headers,
uri: url,
maxAttempts: 5,
retryDelay: 5000,
retryStrategy: retryStrategy,
agent: agent,
timeout: 5000
};
makerequest(options)
.then(response => {
const { body } = response;
console.log('Resolving promise');
const $ = cheerio.load(body);
const ogTitle = $('meta[property="og:title"]').attr('content');
const ogDesc = $('meta[property="og:description"]').attr('content');
const title = $('head > title').text();
const desc = $('head > meta[name="description"]').attr('content');
// console.log({ ogTitle, ogDesc, title, desc });
return resolve(`${domainArr.join(';')};${title || ogTitle || ''};${desc || ogDesc || ''}`);
})
.catch(err => console.log({ err }));
})
.catch(err => console.log(err));
});
};