# Как использовать прокси в Node.js с fetch, undici, axios и got

По умолчанию в Node нет глобальной настройки прокси. Каждый клиент принимает агент или диспетчер; достаточно выбрать нужный вариант, а всё остальное сделает URL HodlProxy.


## Встроенный fetch и undici

Глобальная функция `fetch` в Node работает на базе undici. Передавайте ей `ProxyAgent` для каждого запроса через параметр `dispatcher` или один раз задайте его глобально с помощью `setGlobalDispatcher`.

```javascript
import { fetch, ProxyAgent, setGlobalDispatcher } from "undici";

const proxy = new ProxyAgent("http://USER-cc-us:PASS@res.hodlproxy.com:9000");

// Для отдельного запроса
const res = await fetch("https://api.ipify.org", { dispatcher: proxy });
console.log(await res.text());

// Или глобально, для всех вызовов fetch в процессе
setGlobalDispatcher(proxy);
```

`ProxyAgent` объединяет соединения в пул, поэтому последовательные запросы могут повторно использовать одно соединение и, следовательно, один выходной узел. Чтобы получать новый выходной узел для каждого запроса, создайте агент с параметрами `pipelining: 0` и `connections: 1` или просто используйте разные значения `-sid-` для каждой логической сессии.


## axios

Собственный параметр `proxy` в axios не обеспечивает надёжное туннелирование HTTPS; стандартный подход — агент из `https-proxy-agent` и параметр `proxy: false`.

```javascript
import axios from "axios";
import { HttpsProxyAgent } from "https-proxy-agent";

const agent = new HttpsProxyAgent("http://USER-cc-de-city-berlin-sid-cart42-ttl-15m:PASS@res.hodlproxy.com:9000");
const client = axios.create({ httpsAgent: agent, httpAgent: agent, proxy: false, timeout: 30000 });

const { data } = await client.get("https://api.ipify.org");
console.log(data);
```


## got

```javascript
import got from "got";
import { HttpsProxyAgent } from "https-proxy-agent";

const agent = new HttpsProxyAgent("http://USER-cc-us:PASS@res.hodlproxy.com:9000");
const body = await got("https://api.ipify.org", { agent: { https: agent, http: agent }, timeout: { request: 30000 } }).text();
console.log(body);
```


## SOCKS5

```javascript
import { SocksProxyAgent } from "socks-proxy-agent";

// socks5h разрешает имя назначения на выходном узле
const agent = new SocksProxyAgent("socks5h://USER-cc-us:PASS@res.hodlproxy.com:9001");
const res = await fetch("https://api.ipify.org", { dispatcher: undefined, agent }); // клиенты в стиле node-fetch принимают `agent`
```

> Info: Встроенный fetch не принимает `agent`; для HTTP-прокси используйте `ProxyAgent` из undici, а для SOCKS — совместимый диспетчер, например `fetch-socks`. Для большинства задач проще использовать HTTP-прокси на порту 9000.


## Переменные окружения

По умолчанию undici не читает `HTTPS_PROXY`. В последних версиях undici доступен `EnvHttpProxyAgent`, который поддерживает эту переменную; задайте его как глобальный диспетчер, и весь процесс, включая сторонние библиотеки на основе fetch, будет работать через прокси.

```javascript
import { EnvHttpProxyAgent, setGlobalDispatcher } from "undici";
// HTTPS_PROXY=http://USER-cc-us:PASS@res.hodlproxy.com:9000 NO_PROXY=localhost node app.js
setGlobalDispatcher(new EnvHttpProxyAgent());
```


## Параллельная работа и ротация IP

- Используйте один `ProxyAgent` для каждой закреплённой сессии (с отдельным значением `-sid-`) и передавайте его всем запросам этой сессии.
- Для интенсивной ротации IP оставьте один агент, но отключите повторное использование соединений, либо запустите N агентов с N идентификаторами сессий и перебирайте их по кругу.
- Отслеживайте ошибки `UND_ERR_SOCKET` и `ECONNRESET`: выходной узел резидентского прокси отключился; повторите запрос один раз, и следующее соединение выберет другой узел.


## Вопросы

**Почему axios игнорирует мой прокси для HTTPS?**

Встроенная поддержка прокси в axios ограничена при работе с туннелями CONNECT. Передайте https-proxy-agent как httpsAgent и задайте proxy: false, чтобы axios не пытался самостоятельно обрабатывать прокси.

**Можно ли направлять через прокси только некоторые запросы?**

Да. Передавайте диспетчер или агент только тем запросам, которым нужен прокси, а остальные оставьте без изменений; ничего не становится глобальным, пока вы не вызовете setGlobalDispatcher.

Источник: https://hodlproxy.com/ru/guides/nodejs-fetch-undici-axios
