Почему запросы через прокси не работают в axios или fetch в Node.js?

Здравствуйте, уважаемые эксперты! 

Я впервые столкнулся с необходимостью отправить HTTP-запрос через прокси в Node.js и понял, что это не так просто. У меня не получилось подключиться как на Windows 10, так и на Debian. 

Ниже я привожу код, который я пытался использовать, а также комментарии к нему. Хочу подчеркнуть, что прокси, которые я применял, работают исправно.

Использую Node.js версии 18.20.6. 

```javascript
///////// axois ///////////

const axios = require('axios');

axios.get('https://www.httpbin.org/ip', {
	'responseType': 'text',
	'timeout':120000, 
	'proxy': {
		'protocol': 'http',
		'host': 'x.x.x.x', // подставьте свой прокси хост
		//'hostname': 'x.x.x.x', // <--- пробовал раскомментировать эту строку и закомментировать верхнюю, но это не помогло; пробовал обе раскомментировать, не помогло
		'port': 0000, // подставьте свой прокси порт
		'auth': {
			'username': 'username', // подставьте свой прокси username
			'password': 'password' // подставьте свой прокси password
		}
	}
})
.then((res) => { console.log('res.data:', res.data) })
.catch((err) => {
	if (err.response) {
		console.log('err.response.data:', err.response.data);
	} else if(err.request) {
		console.log('err.request:', err.request);
	} else {
		console.log('err.message:', err.message);
	}
```

Не могли бы вы помочь мне разобраться с этой проблемой?
  • 30 марта 2025 г. 15:55
Ответы на вопрос 1
Чтобы отправить HTTP-запрос через прокси в Node.js с помощью библиотеки axios, нужно использовать сторонние библиотеки, потому что axios не поддерживает прокси-класс прямо "из коробки" для HTTP-запросов. Давайте рассмотрим несколько вариантов, которые могут помочь вам исправить вашу проблему.

### Использование библиотеки `https-proxy-agent`

Одним из простых решений является использование библиотеки `https-proxy-agent`. Вот пример, как вы можете это сделать:

1. Установите нужную библиотеку:

```bash
npm install axios https-proxy-agent
```

2. Используйте ее в вашем коде:

```javascript
const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');

// Создайте URL для вашего прокси
const proxyUrl = 'http://username:password@x.x.x.x:0000';

const agent = new HttpsProxyAgent(proxyUrl);

axios.get('https://www.httpbin.org/ip', {
    httpAgent: agent,
    httpsAgent: agent,
    timeout: 120000
})
.then((res) => {
    console.log('res.data:', res.data);
})
.catch((err) => {
    if (err.response) {
        console.log('err.response.data:', err.response.data);
    } else if (err.request) {
        console.log('err.request:', err.request);
    } else {
        console.log('err.message:', err.message);
    }
});
```

### Использование библиотеки `axios` с `proxy-agent`

Можно также использовать библиотеку `axios` с другим прокси-агентом:

1. Установите необходимые библиотеки:

```bash
npm install axios axios-proxy-agent
```

2. Используйте `axios-proxy-agent` в вашем коде:

```javascript
const axios = require('axios');
const AxiosProxy = require('axios-proxy-agent');

// Создайте URL для вашего прокси
const proxyUrl = 'http://username:password@x.x.x.x:0000';

// Создайте агент
const agent = AxiosProxy(proxyUrl);

axios.get('https://www.httpbin.org/ip', {
    httpsAgent: agent,
    timeout: 120000
})
.then((res) => {
    console.log('res.data:', res.data);
})
.catch((err) => {
    if (err.response) {
        console.log('err.response.data:', err.response.data);
    } else if (err.request) {
        console.log('err.request:', err.request);
    } else {
        console.log('err.message:', err.message);
    }
});
```

### Заметки

1. **Статус прокси**: Убедитесь, что ваш прокси-сервер работает и доступен для использования.
2. **Аутентификация**: Проверьте, правильно ли вы указали имя пользователя и пароль. Обратите внимание на их корректность и возможные лишние пробелы.
3. **Проверка**: Попробуйте протестировать ваш прокси с помощью других инструментов, чтобы убедиться, что он работает должным образом, например, через `curl`.

Эти подходы должны помочь вам установить соединение через прокси с использованием axios в Node.js.
Похожие вопросы