К содержимому

Node.js fetch и axios через прокси: SOCKS5 и undici

Четыре способа задать прокси для fetch и axios в Node.js и ошибки, из-за которых запросы тихо идут напрямую.

Почему fetch всё равно показывает ваш IP

Одной переменной HTTP_PROXY мало: в документации Node сказано, что поддержка прокси выключена, пока не задана NODE_USE_ENV_PROXY=1 или флаг --use-env-proxy, а переменная читается при старте процесса. В нашем тесте скрипт на Node 24.14.0 с HTTP_PROXY, но без флага, обратился к тестовой странице напрямую.

Есть ещё три ловушки. Импорт пакета undici в начале файла может подменить глобальный dispatcher: с undici 8.12.4 fetch шёл напрямую даже при NODE_USE_ENV_PROXY=1, а с undici 7.30.2 этого не было. Dispatcher из установленного undici может не приниматься встроенным fetch, если версии разные (мы получили UND_ERR_INVALID_ARG). А axios вообще не использует переключатель Node: он сам читает те же переменные, и если передан параметр proxy или agent, приоритет у них.

Со вторым случаем помогает использовать fetch из того же пакета, что и dispatcher, или зарегистрировать dispatcher глобально через setGlobalDispatcher().

Четыре способа задать прокси для fetch и axios

Четыре способа задать прокси для fetch и axios
ПунктЧто охватываетSOCKS5Что проверить
NODE_USE_ENV_PROXY=1 (или --use-env-proxy)Встроенный fetch и запросы http/https; читает HTTP_PROXY, HTTPS_PROXY, NO_PROXYНет: в документации только адреса http:// и https://Node 24 или 22.21 и новее; задавайте до запуска процесса, а не во время работы
undici EnvHttpProxyAgent + setGlobalDispatcherВсе fetch() после регистрации, те же переменныеЧерез переменные нетЗарегистрируйте один раз и рано; версии fetch и агента должны совпадать
undici ProxyAgent как dispatcherОдин вызов или все, если задан глобальноДа: адреса socks5: (в нашем тесте было предупреждение «экспериментально»)fetch берите из undici; логин в адресе для HTTP кодируйте через %
параметр proxy в axios или переменные окруженияТолько запросы axios; HTTP-прокси, туннель CONNECT для https://Нет, в документации не описаноproxy: false отключает и параметр, и переменные
axios + socks-proxy-agentЗапросы axios через SOCKS5-проксиДа, агент нужен и в httpAgent, и в httpsAgentЗадайте proxy: false, чтобы axios не добавлял свой

Источник: документация Node.js, undici и axios и наш локальный тест от 14 ноября 2026 (Node.js 24.14.0, axios 1.21.1). Номера версий — те, что мы проверяли.

Что мы измерили на локальном прокси

Мы запустили каждый вариант на локальном прокси, который требует логин и записывает каждый запрос. Без флага встроенный fetch игнорировал HTTP_PROXY. С NODE_USE_ENV_PROXY=1 запрос доходил до прокси с логином. EnvHttpProxyAgent, зарегистрированный через setGlobalDispatcher, работал, как и ProxyAgent из undici вместе с fetch из undici. axios работал и через параметр proxy, и через переменные окружения, а с SocksProxyAgent — и через локальный SOCKS5-прокси.

Тестовая страница была по обычному HTTP; для страниц https:// документация сообщает, что undici и axios открывают туннель CONNECT. Результаты меняются от версии к версии, поэтому повторите проверку на своих.

Встроенная поддержка: запустите Node с переменной

# Node.js 24 (or 22.21 and newer): switch the built-in support on at start-up
NODE_USE_ENV_PROXY=1 \
HTTPS_PROXY="http://LOGIN:PASSWORD@HOST:2222" \
NO_PROXY="localhost,127.0.0.1" \
node app.js

# the same thing as a flag
HTTPS_PROXY="http://LOGIN:PASSWORD@HOST:2222" node --use-env-proxy app.js

Только пример: замените LOGIN, PASSWORD и HOST значениями из «Мои активы». Спецсимволы в логине кодируйте через %.

fetch из undici: один вызов или весь процесс

// npm i undici
import { fetch, ProxyAgent, EnvHttpProxyAgent, setGlobalDispatcher } from 'undici'

// A) one dispatcher for one call. Use fetch from the same undici package.
const login = encodeURIComponent('LOGIN')
const pass = encodeURIComponent('PASSWORD')
const agent = new ProxyAgent(`http://${login}:${pass}@HOST:2222`)
const res = await fetch('https://ipinfo.io/json', { dispatcher: agent })
console.log(await res.json())

// B) every fetch() in the process, driven by HTTPS_PROXY / NO_PROXY
// (the agent does nothing until it is registered)
setGlobalDispatcher(new EnvHttpProxyAgent())

Проверено 14 ноября 2026 на локальном HTTP-прокси с логином, тестовая страница по обычному HTTP, undici 8.12.4 и 7.30.2. Подставьте свои значения.

axios: HTTP через proxy, SOCKS5 через агент

// npm i axios socks-proxy-agent
import axios from 'axios'
import { SocksProxyAgent } from 'socks-proxy-agent'

// HTTP proxy: axios' own proxy option
const viaHttp = await axios.get('https://ipinfo.io/json', {
  proxy: { protocol: 'http', host: 'HOST', port: 2222, auth: { username: 'LOGIN', password: 'PASSWORD' } },
})
console.log(viaHttp.data)

// SOCKS5 proxy: hand axios an agent and turn its own proxy handling off
const agent = new SocksProxyAgent(
  `socks5h://${encodeURIComponent('LOGIN')}:${encodeURIComponent('PASSWORD')}@HOST:3333`
)
const viaSocks = await axios.get('https://ipinfo.io/json', { proxy: false, httpAgent: agent, httpsAgent: agent })
console.log(viaSocks.data)

Оба варианта проверены 14 ноября 2026 на локальных прокси с логином (страница по HTTP). Подставьте свои значения; порт должен соответствовать купленному протоколу.

SOCKS5 с логином: две детали

socks-proxy-agent декодирует логин и пароль из процентной кодировки перед отправкой: в тесте прокси получил обычные имя и пароль, а со схемой socks5h — имя хоста вместо IP. ProxyAgent из undici с адресом socks5: не декодирует: прокси получил %40 и %3A как есть. Если в пароле есть спецсимволы, используйте socks-proxy-agent или пароль без них.

Обе библиотеки требуют, чтобы прокси говорил на SOCKS5 на порту SOCKS5. У Proxy302 это порт 3333, и доступ должен быть создан как SOCKS5; HTTP работает на 2222.

Симптомы и что делать

Скрипт печатает ваш собственный IP

Проверьте Задана ли NODE_USE_ENV_PROXY=1 до запуска node, версия Node 24 или 22.21+? Есть ли в файле импорт undici? Не задан ли proxy: false в axios?

Решение Запустите с переменной, выведите process.version и process.versions.undici и обратитесь к https://ipinfo.io/json. Используйте dispatcher или agent, подходящий вашей библиотеке.

Когда остановиться Если после глобальной регистрации dispatcher IP всё ещё ваш, не меняйте код дальше, а проверьте сам прокси через curl.

fetch failed с кодом UND_ERR_INVALID_ARG

Проверьте Dispatcher создан установленным undici, а fetch — встроенный?

Решение Импортируйте fetch тоже из undici или зарегистрируйте dispatcher через setGlobalDispatcher().

407 или Proxy Authentication Required

Проверьте Закодированы ли логин и пароль в адресе через %, и это ли логин именно этого актива?

Решение Заново скопируйте host, port, username и password из «Мои активы», пароль закодируйте через encodeURIComponent.

ECONNRESET или socket hang up на адресе SOCKS5

Проверьте Порт 3333, и создан ли доступ как SOCKS5?

Решение Создайте или купите доступ как SOCKS5 либо переключите код на HTTP-порт 2222 и адрес http://.

Какой продукт Proxy302 подойдёт скрипту на Node.js

Для серверов, тестов и скриптов, которые не входят в аккаунты, подойдёт серверный IP в аренду по одному: $0,25 за 1 сутки или $3,99 за 30 суток; HTTP (порт 2222) или SOCKS5 (порт 3333) выбирается при покупке, в одном заказе до 100 IP. Серверные адреса определяются как серверные, поэтому для работы с аккаунтами, магазинами и рекламными кабинетами берите статический ISP IP — от $0,50 в сутки.

Бесплатного теста нет; минимальная покупка — один IP на одни сутки.

Как сделать с Proxy302: шаги

  1. Шаг 1

    Откройте страницу серверных IP, выберите страну, срок и протокол (HTTP для fetch и параметра proxy в axios, SOCKS5 для варианта с агентом), проверьте стоимость и оплатите с кошелька.

  2. Шаг 2

    Откройте «Мои активы» и скопируйте host, port, username и password.

  3. Шаг 3

    Подставьте их в пример для выбранного способа или в HTTPS_PROXY для встроенного переключателя.

  4. Шаг 4

    Обратитесь к https://ipinfo.io/json и сравните выведенный IP со своим.

    Ожидаемый результат IP прокси, а не ваш.

Частые вопросы

Использует ли fetch в Node.js переменную HTTP_PROXY?

По умолчанию нет. Встроенная поддержка выключена, пока при запуске не задана NODE_USE_ENV_PROXY=1 или --use-env-proxy; нужен Node 24 или 22.21 и новее.

Как использовать SOCKS5-прокси с axios?

Создайте SocksProxyAgent, передайте его и в httpAgent, и в httpsAgent и задайте proxy: false. В документации axios собственной поддержки SOCKS нет.

Почему встроенный fetch не принимает мой ProxyAgent из undici?

Они могут быть из разных версий undici. Берите fetch из пакета undici или задайте dispatcher глобально.

Что приоритетнее: HTTP_PROXY или http_proxy?

В документации Node и undici сказано: если заданы обе, побеждает форма в нижнем регистре.

Поддерживает ли undici SOCKS5?

В документации SOCKS5 описан через адреса socks5:. В нашем тесте он работал и выводил предупреждение «экспериментально».

Ссылки и источники

9
  1. Документация Node.js: NODE_USE_ENV_PROXY и --use-env-proxy

    Официальная документация · Проверено:

    Прочитано 14 ноября 2026 (страница параметров командной строки): NODE_USE_ENV_PROXY=1 добавлена в v24.0.0 и v22.21.0, стабильность 1.1 (активная разработка); при включении Node при запуске разбирает HTTP_PROXY, HTTPS_PROXY и NO_PROXY и направляет запросы через прокси.

  2. Документация Node.js: встроенная поддержка прокси (http)

    Официальная документация · Проверено:

    Прочитано 14 ноября 2026: при значении 1 глобальный агент создаётся с proxyEnv: process.env; переменные в нижнем регистре приоритетнее; адрес прокси — http:// или https:// с user:pass@host:port; форматы NO_PROXY; http.setGlobalProxyFromEnv() включает поддержку из кода для fetch() и http.request().

  3. Документация Node.js: fetch и свой dispatcher (globals)

    Официальная документация · Проверено:

    Прочитано 14 ноября 2026: fetch основан на undici; process.versions.undici показывает встроенную версию; fetch принимает параметр dispatcher; setGlobalDispatcher() из установленного пакета undici влияет и на undici, и на Node.js.

  4. Документация undici: EnvHttpProxyAgent

    Официальная документация · Проверено:

    Прочитано 14 ноября 2026: читает http_proxy, https_proxy, no_proxy (и варианты в верхнем регистре; если заданы оба, побеждает нижний); fetch начинает его использовать после setGlobalDispatcher(new EnvHttpProxyAgent()); один только вызов конструктора ничего не меняет.

  5. Документация undici: ProxyAgent

    Официальная документация · Проверено:

    Прочитано 14 ноября 2026: поддерживаются HTTP-, HTTPS- и SOCKS5-прокси; адреса socks5: передаются в Socks5ProxyAgent; логин и пароль из адреса HTTP-прокси URL-декодируются; HTTPS-цели идут через туннель CONNECT.

  6. README axios: параметры запроса (proxy)

    Официальная документация · Проверено:

    Прочитано 14 ноября 2026: объект proxy (protocol, host, port, auth); false отключает прокси и игнорирует переменные окружения; учитываются http_proxy, https_proxy и no_proxy; для https:// axios открывает туннель CONNECT и отправляет Proxy-Authorization в нём; переданный agent сам отвечает за туннель. SOCKS не упоминается.

  7. README socks-proxy-agent

    Официальная документация · Проверено:

    Прочитано 14 ноября 2026: SocksProxyAgent — именованный экспорт, передаётся как параметр agent в https.get; про axios и схему socks5h в README ничего нет, эти части опираются на наш тест.

  8. Локальный тест, 14 ноября 2026

    Локальный пример · Проверено:

    Запущено 14 ноября 2026 на macOS с Node.js 24.14.0 (встроенный undici 7.21.0), axios 1.21.1, undici 8.12.4 и 7.30.2, socks-proxy-agent: локальный HTTP-прокси с логином, локальный SOCKS5-прокси с логином и тестовая страница по обычному HTTP; каждый запрос фиксировался на стороне прокси.

    Тестовая страница по обычному HTTP; туннель HTTPS взят из документации. Версии быстро меняются — повторите тест на своих.

  9. Proxy302: данные о продуктах и цены

    Наблюдение за продуктом · Проверено:

    Таблица фактов о продуктах сайта (сверено 10 ноября 2026): протоколы и порты, цены в US$ (1 PTC = US$1), сроки аренды, лимиты количества, бесплатного теста нет.

Готовы попробовать?

Создайте аккаунт, пополните баланс и выберите ротируемый резидентный, статический ISP или дата-центр IP — настроить его в браузере можно за несколько минут.