NodeJS + Модуль запроса: время ожидания шлюза - PullRequest
0 голосов
/ 13 сентября 2018

Я использую 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));

});  

};
...