Настройка прокси в Node.js
Добавьте SotaProxy в любой HTTP-клиент Node.js - fetch, axios или got.
Node.js не поддерживает конфигурацию прокси нативно через переменные окружения для всех HTTP-клиентов. Большинству библиотек нужен прокси-агент - небольшой пакет, который обрабатывает туннелирование соединения.
Руководство по настройке
Установите https-proxy-agent
npm install https-proxy-agentПакет https-proxy-agent создаёт HTTP-агенты с поддержкой прокси для Node.js.
Нативный fetch (Node 18+)
import { HttpsProxyAgent } from 'https-proxy-agent';
const proxyUrl = 'http://YOUR_USERNAME:YOUR_PASSWORD@proxy.sotaproxy.com:10000';
const agent = new HttpsProxyAgent(proxyUrl);
const response = await fetch('https://httpbin.org/ip', { agent });
const data = await response.json();
console.log(data);Node 18+ включает нативный fetch. Передайте прокси-агент в объекте опций.
axios
import axios from 'axios';
import { HttpsProxyAgent } from 'https-proxy-agent';
const proxyUrl = 'http://YOUR_USERNAME:YOUR_PASSWORD@proxy.sotaproxy.com:10000';
const httpsAgent = new HttpsProxyAgent(proxyUrl);
const response = await axios.get('https://httpbin.org/ip', { httpsAgent });
console.log(response.data);Передайте прокси-агент как httpsAgent в объекте конфигурации axios.
got
import got from 'got';
import { HttpsProxyAgent } from 'https-proxy-agent';
const proxyUrl = 'http://YOUR_USERNAME:YOUR_PASSWORD@proxy.sotaproxy.com:10000';
const agent = { https: new HttpsProxyAgent(proxyUrl) };
const response = await got('https://httpbin.org/ip', { agent });
console.log(response.body);got использует объект agent с ключами http и https. Передайте прокси-агент под ключом https.
Автоматизируй через SotaProxy API
Всё описанное выше работает без открытия дашборда. С API-ключом Node.js может получать свежие данные прокси, покупать новые и продлевать истекающие - прямо из кода.
const API = 'https://api.sotaproxy.com/api/v1'
const H = { Authorization: 'Bearer sk_live_your_key' }
// Every active proxy on your account - no copy-pasting credentials
const { proxies } = await (await fetch(`${API}/proxies`, { headers: H })).json()
const p = proxies[0]
const proxyUrl = `http://${p.login}:${p.password}@${p.ip}:${p.portHttp}`
// Buy more when you scale (price-check first with POST /quote)
await fetch(`${API}/orders`, {
method: 'POST',
headers: { ...H, 'Content-Type': 'application/json', 'Idempotency-Key': 'my-unique-order-id' },
body: JSON.stringify({ product: 'ipv4', countryId: 565, periodId: '1m', quantity: 5 }),
})Агенты, а не настройки
Глобального переключателя прокси в Node нет. Каждый HTTP-клиент принимает агента, а агент несёт адрес и учётные данные:
https-proxy-agent закрывает цели по HTTP и HTTPS. socks-proxy-agent закрывает SOCKS5, а его вариант socks5h разрешает DNS на нашей стороне.
Агент на личность
Стройте агента один раз на номер сессии и переиспользуйте. Создание агента на каждый запрос выбрасывает переиспользование соединений и замедляет прогон:
Node: пул агентов с fetch
import { HttpsProxyAgent } from 'https-proxy-agent';
const BASE = 'proxy.sotaproxy.com:10000';
const agents = new Map();
function agentFor(sessionId, country = 'US') {
if (!agents.has(sessionId)) {
const login = `login_c_${country}_s_${sessionId}_ttl_15m`;
agents.set(sessionId, new HttpsProxyAgent(`http://${login}:password@${BASE}`));
}
return agents.get(sessionId);
}
const res = await fetch('https://example.com', {
agent: agentFor(4),
headers: { 'Accept-Encoding': 'gzip' },
signal: AbortSignal.timeout(30000),
});- Встроенный fetch в Node 18 игнорирует опцию agent. Берите undici с ProxyAgent, либо node-fetch, либо axios с httpsAgent.
- Всегда передавайте сигнал таймаута. Иначе Node будет ждать зависший маршрут бесконечно.
- Держите агентов в словаре по номеру сессии. Пересборка на каждый запрос стоит рукопожатия TLS каждый раз.
- Для SOCKS5 с удалённым DNS пишите socks5h в URL, правило то же, что и везде.
Особенности Node
Глобальный fetch молча игнорирует агентов
Самая частая путаница в Node 18 и новее. Запрос уходит напрямую, а выглядит это как отказ прокси.
Агент на каждый запрос
Каждый новый агент открывает новое соединение с нами. Под нагрузкой одно это способно урезать пропускную способность вдвое.
Таймаута по умолчанию нет
Один зависший запрос держит воркер вечно. AbortSignal.timeout это одна строка, которая это предотвращает.
Учётные данные в логах
URL прокси содержит пароль. Вырезайте его перед логированием, иначе отчёт о падении утащит аккаунт наружу.
Заметки и советы
- •Для гео-таргетинга добавьте _c_XX к имени пользователя в URL прокси.
- •Ротация происходит на стороне сервера - менять URL прокси между запросами для ротации IP не нужно.
- •Проверьте соединение: node -e "require('https-proxy-agent').HttpsProxyAgent; const {fetch} = globalThis; ..."
FAQ
Нужен ли пакет прокси-агента для Node.js?
Да. Нативный fetch в Node.js и большинство HTTP-библиотек не поддерживают конфигурацию прокси через простые параметры URL. Пакет https-proxy-agent обрабатывает CONNECT-туннелирование для HTTPS-запросов.
Можно ли задать прокси через переменные окружения в Node.js?
Некоторые библиотеки (например, undici, axios с плагином прокси) поддерживают переменную окружения HTTPS_PROXY. Смотрите документацию вашей библиотеки. Подход через агент работает во всех библиотеках без зависимости от окружения.
Похожие интеграции
Получи учётные данные прокси
Зарегистрируйся, пополни баланс и скопируй эндпоинт в Node.js. Займёт менее 5 минут.
Начать