Реферальная программа
Разработка

Настройка прокси в Node.js

Добавьте SotaProxy в любой HTTP-клиент Node.js - fetch, axios или got.

Node.js не поддерживает конфигурацию прокси нативно через переменные окружения для всех HTTP-клиентов. Большинству библиотек нужен прокси-агент - небольшой пакет, который обрабатывает туннелирование соединения.

Руководство по настройке

1

Установите https-proxy-agent

bash
npm install https-proxy-agent

Пакет https-proxy-agent создаёт HTTP-агенты с поддержкой прокси для Node.js.

2

Нативный fetch (Node 18+)

javascript
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. Передайте прокси-агент в объекте опций.

3

axios

javascript
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.

4

got

javascript
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 может получать свежие данные прокси, покупать новые и продлевать истекающие - прямо из кода.

javascript
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 }),
})
Документация API

Агенты, а не настройки

Глобального переключателя прокси в Node нет. Каждый HTTP-клиент принимает агента, а агент несёт адрес и учётные данные:

Ротация резидентки
login:password@proxy.sotaproxy.com:10000
Привязка к стране
login_c_US:password@proxy.sotaproxy.com:10000
Липкая на 15 минут
login_c_US_s_42_ttl_15m:password@proxy.sotaproxy.com:10000
Статический адрес (ISP, датацентр)
login:password@ваш-ip:50100, SOCKS5 на 50101

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 минут.

Начать