Сокет зависает при использовании axios.get, но не при использовании https.get

Насколько я знаю, я делаю одно и то же, используя два разных подхода:

const https = require("https");
const axios = require("axios");

let httpsAgent = new https.Agent({rejectUnauthorized: false});

axios.get(`https://${hostname}:${port}${path}`, {httpsAgent})
    .then((data) => { console.log("axios success: " + data.substr(0, 100)); })
    .catch((error) => { console.log("axios error: " + error); });

let data = "";
https.get({ hostname, path, port, agent: httpsAgent },
    (response) => {
        response.on("data", (chunk) => { data += chunk; });
        response.on("end", () => { console.log("https success: " + data.substr(0, 100)); });
    })
    .on("error", (error) => { console.log("https error: " + error); });

Когда я запускаю этот код, я получаю 2 разных результата:

PS C:\Users\me> .\node\node.exe .\generate-test-data.js
axios error: Error: socket hang up
https success: [{"cool":"data"...

Что здесь происходит? У меня есть ощущение, что это связано с асинхронностью, но я не совсем уверен, как... Может ли кто-нибудь дать мне подсказку о том, как / почему эти два поведения отличаются?

2 ответа

Решение

ARGH!

Покопавшись в источнике axios, я нашел это:

if (!proxy) {
  var proxyEnv = protocol.slice(0, -1) + '_proxy';
  var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()];
  if (proxyUrl) {
    var parsedProxyUrl = url.parse(proxyUrl);
    proxy = {
      host: parsedProxyUrl.hostname,
      port: parsedProxyUrl.port
    };

    if (parsedProxyUrl.auth) {
      var proxyUrlAuth = parsedProxyUrl.auth.split(':');
      proxy.auth = {
        username: proxyUrlAuth[0],
        password: proxyUrlAuth[1]
      };
    }
  }
}

Но ничего для no_proxy, Кажется, для этого есть запрос функции... А пока мне просто нужно:

    delete process.env['http_proxy'];
    delete process.env['HTTP_PROXY'];
    delete process.env['https_proxy'];
    delete process.env['HTTPS_PROXY'];

Спасибо за руководство (и копание :)), код, который вы идентифицировали, взят из модуля http и вокруг него; есть ключ к тому, что эта проблема может быть решена двумя другими подходами

  1. настроить proxy = false в конфигурации axios, что-то вроде -
      https.get({ hostname, path, port, proxy:false, agent: httpsAgent },
  1. настроить переменную env без прокси для целевого хоста
      $export NO_PROXY=<host name of targeted URL>

Я попробовал оба вышеперечисленных подхода, и это действительно решило проблему. Ваше здоровье.

Другие вопросы по тегам