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 и запросы 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.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.
Проверьте Задана ли 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 на одни сутки.
Откройте страницу серверных IP, выберите страну, срок и протокол (HTTP для fetch и параметра proxy в axios, SOCKS5 для варианта с агентом), проверьте стоимость и оплатите с кошелька.
Шаг 2
Откройте «Мои активы» и скопируйте host, port, username и password.
Шаг 3
Подставьте их в пример для выбранного способа или в HTTPS_PROXY для встроенного переключателя.
Шаг 4
Обратитесь к https://ipinfo.io/json и сравните выведенный IP со своим.
Ожидаемый результат IP прокси, а не ваш.
Частые вопросы
Использует ли fetch в Node.js переменную HTTP_PROXY?
По умолчанию нет. Встроенная поддержка выключена, пока при запуске не задана NODE_USE_ENV_PROXY=1 или --use-env-proxy; нужен Node 24 или 22.21 и новее.
Прочитано 14 ноября 2026 (страница параметров командной строки): NODE_USE_ENV_PROXY=1 добавлена в v24.0.0 и v22.21.0, стабильность 1.1 (активная разработка); при включении Node при запуске разбирает HTTP_PROXY, HTTPS_PROXY и NO_PROXY и направляет запросы через прокси.
Прочитано 14 ноября 2026: при значении 1 глобальный агент создаётся с proxyEnv: process.env; переменные в нижнем регистре приоритетнее; адрес прокси — http:// или https:// с user:pass@host:port; форматы NO_PROXY; http.setGlobalProxyFromEnv() включает поддержку из кода для fetch() и http.request().
Прочитано 14 ноября 2026: fetch основан на undici; process.versions.undici показывает встроенную версию; fetch принимает параметр dispatcher; setGlobalDispatcher() из установленного пакета undici влияет и на undici, и на Node.js.
Прочитано 14 ноября 2026: читает http_proxy, https_proxy, no_proxy (и варианты в верхнем регистре; если заданы оба, побеждает нижний); fetch начинает его использовать после setGlobalDispatcher(new EnvHttpProxyAgent()); один только вызов конструктора ничего не меняет.
Прочитано 14 ноября 2026: поддерживаются HTTP-, HTTPS- и SOCKS5-прокси; адреса socks5: передаются в Socks5ProxyAgent; логин и пароль из адреса HTTP-прокси URL-декодируются; HTTPS-цели идут через туннель CONNECT.
Прочитано 14 ноября 2026: объект proxy (protocol, host, port, auth); false отключает прокси и игнорирует переменные окружения; учитываются http_proxy, https_proxy и no_proxy; для https:// axios открывает туннель CONNECT и отправляет Proxy-Authorization в нём; переданный agent сам отвечает за туннель. SOCKS не упоминается.
Прочитано 14 ноября 2026: SocksProxyAgent — именованный экспорт, передаётся как параметр agent в https.get; про axios и схему socks5h в README ничего нет, эти части опираются на наш тест.
Локальный тест, 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 взят из документации. Версии быстро меняются — повторите тест на своих.
Proxy302: данные о продуктах и цены
Наблюдение за продуктом · Проверено:
Таблица фактов о продуктах сайта (сверено 10 ноября 2026): протоколы и порты, цены в US$ (1 PTC = US$1), сроки аренды, лимиты количества, бесплатного теста нет.
Готовы попробовать?
Создайте аккаунт, пополните баланс и выберите ротируемый резидентный, статический ISP или дата-центр IP — настроить его в браузере можно за несколько минут.