NP NEONPROXYPROXY NETWORK
КупитьЦеныFAQПартнёркаБлог Прокси-чекерМой IPAPI TG-бот

Прокси в Node.js и Axios: fetch через прокси

Node.js давно перестал быть только сервером для фронтенда: на нём строят краулеры, ETL-пайплайны и микросервисы мониторинга цен. Когда нужно распределить исходящие запросы по разным IP или проверить API из другого региона, без прокси не обойтись. Разберём три рабочих подхода — Axios, native fetch и агенты из экосистемы undici — на примере данных NEONPROXY в формате host:port:login:password.

Axios с HTTPS-прокси

Axios не принимает прокси «из коробки» — нужен агент. Пакет https-proxy-agent создаёт туннель CONNECT для HTTPS-трафика:

import axios from "axios"; import { HttpsProxyAgent } from "https-proxy-agent"; const proxyUrl = "http://user:pass@185.22.34.89:8080"; const agent = new HttpsProxyAgent(proxyUrl); const { data } = await axios.get("https://api.ipify.org?format=json", { httpsAgent: agent, httpAgent: agent, timeout: 15000, }); console.log(data.ip); // IP прокси

Если в ответе ваш домашний адрес — прокси не применился. Проверьте учётные данные и порт через прокси-чекер до отладки кода.

SVYAZVPN — свобода без границ

Native fetch в Node.js 18+

Начиная с Node 18, глобальный fetch доступен без polyfill. Прокси задаётся через опцию dispatcher из undici или через тот же HttpsProxyAgent:

import { fetch } from "undici"; import { ProxyAgent } from "undici"; const agent = new ProxyAgent("http://user:pass@185.22.34.89:8080"); const res = await fetch("https://example.com/api", { dispatcher: agent, }); const json = await res.json();

Для long-polling и стриминга агент переиспользуйте на уровне модуля — создание нового ProxyAgent на каждый запрос увеличивает латентность.

SOCKS5 через socks-proxy-agent

Если в кабинете NEONPROXY выбран SOCKS5, установите socks-proxy-agent. URL формируется как socks5://login:password@host:port. Подробнее о различиях протоколов — в материале SOCKS5 vs HTTPS.

import { SocksProxyAgent } from "socks-proxy-agent"; const agent = new SocksProxyAgent("socks5://user:pass@185.22.34.89:1080"); await axios.get("https://target.com", { httpsAgent: agent, httpAgent: agent });

SOCKS5 удобен, когда приложение обращается к нестандартным портам или когда HTTP-прокси некорректно обрабатывает WebSocket.

Ротация пула и retry

Для мониторинга публичных данных распределяйте запросы по нескольким адресам. Простейший round-robin с обработкой 429:

const pool = [ "http://u1:p1@10.0.0.1:8080", "http://u2:p2@10.0.0.2:8080", ]; let idx = 0; async function fetchWithProxy(url) { for (let attempt = 0; attempt < 3; attempt++) { const proxy = pool[idx++ % pool.length]; const agent = new HttpsProxyAgent(proxy); try { const res = await fetch(url, { dispatcher: agent, signal: AbortSignal.timeout(15000) }); if (res.status === 429) continue; return res; } catch (e) { /* следующий прокси */ } } throw new Error("Pool exhausted"); }

Список адресов можно подгружать из API NEONPROXY — так пул пополняется без ручного копирования из кабинета.

Отладка и типичные ошибки

ECONNREFUSED — неверный порт или прокси недоступен. 407 Proxy Authentication Required — ошибка в логине или пароле. certificate has expired — проблема на стороне целевого сайта, не прокси. Включите NODE_DEBUG=http,https только на dev-машине: в production логи могут содержать credentials.

Перед масштабированием убедитесь, что целевой сервис разрешает автоматизированный доступ к публичным данным и что вы соблюдаете лимиты запросов. Прокси не отменяет правила площадки — он лишь меняет исходящий IP. Для SMM-задач с авторизованными сессиями закрепляйте один IP на аккаунт, как описано в гайде по ротации прокси.

IPv6 и геолокация

IPv6-адрес прокси в URL заключается в квадратные скобки: http://user:pass@[2a01:4f8:...]:8080. Проверьте, что целевой домен резолвится в AAAA, через инструмент проверки IPv6. Для задач, где важен регион исходящего трафика, выбирайте гео при заказе — это критично при тестировании CDN и региональных API.