Использование прокси-сервера разработки с приложениями Node.js
Нет стандартного способа включения прокси-серверов для Node.js приложений. Можно ли использовать прокси-сервер, зависит от библиотеки, которую вы используете для выполнения HTTP-запросов. Как правило, необходимо обновить код для настройки прокси-сервера. Однако пакет можно использовать global-agent
для включения поддержки прокси-сервера для приложения Node.js с минимальными изменениями кода.
API получения собственных Node.js
В версии 17.5.0 Node.js предоставляет экспериментальную поддержку fetch
API. К сожалению, этот API по-прежнему ограничен и не поддерживает настройку прокси-сервера. Если вы хотите использовать прокси-сервер разработки с Node.js, необходимо использовать другую библиотеку для выполнения HTTP-запросов.
global-agent
global-agent
— это популярная библиотека, которая предоставляет глобальный агент HTTP/HTTPS для Node.js. Он позволяет указать прокси-сервер с помощью переменных среды. Преимуществом использования global-agent
является то, что вам не нужно изменять способ выдачи HTTP-запросов в приложении для использования прокси-сервера разработки.
Ниже приведен пример использования global-agent
в приложении Node.js, которое использует node-fetch
:
import fetch from 'node-fetch';
import { bootstrap } from 'global-agent';
bootstrap();
(async () => {
const result = await fetch('https://jsonplaceholder.typicode.com/posts');
const jsonResult = await result.json();
console.log(JSON.stringify(jsonResult, null, 2));
})();
Вот как можно использовать global-agent
с Node.js и стандартным https
модулем:
const https = require('https');
const globalAgent = require('global-agent');
globalAgent.bootstrap();
https.get('https://jsonplaceholder.typicode.com/posts', (resp) => {
let data = '';
resp.on('data', (d) => {
data += d;
});
resp.on('end', () => {
console.log(JSON.parse(data));
});
resp.on('error', (err) => {
console.error(err);
});
});
При запуске приложения укажите прокси-сервер с помощью переменной GLOBAL_AGENT_HTTP_PROXY
среды и игнорируйте ошибки сертификатов.
NODE_TLS_REJECT_UNAUTHORIZED=0 GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8000 node global-node-fetch.mjs
выборка узла
Node-fetch — это популярная библиотека, которая предоставляет fetch
реализацию для Node.js. node-fetch
не поддерживает указание прокси-сервера с помощью переменных среды. Вместо этого необходимо создать пользовательский агент и передать его методу fetch
.
Ниже приведен пример использования node-fetch
с прокси-сервером разработки, определив агент с помощью https-proxy-agent
пакета.
const fetch = require('node-fetch');
const { HttpsProxyAgent } = require('https-proxy-agent');
(async () => {
// Create a custom agent pointing to Dev Proxy
const agent = new HttpsProxyAgent('http://127.0.0.1:8000');
// Pass the agent to the fetch method
const result = await fetch('https://jsonplaceholder.typicode.com/posts', { agent });
const jsonResult = await result.json();
console.log(JSON.stringify(jsonResult, null, 2));
})();
Аксиомы
Axios — это другая популярная библиотека для выполнения HTTP-запросов в Node.js. Axios позволяет указать прокси-сервер с помощью переменных среды или указать агент непосредственно в конфигурации запроса.
Использование Axios и Dev Proxy с переменными среды
При использовании прокси-сервера разработки с Axios и указания прокси-сервера с помощью переменных среды вам не нужно изменять код. Все, что необходимо сделать, — задать https_proxy
переменную среды, и Axios использует ее для выполнения запросов.
import axios from 'axios';
(async () => {
const result = await axios.get('https://jsonplaceholder.typicode.com/posts');
const response = result.data;
console.log(JSON.stringify(response, null, 2));
})();
https_proxy
Укажите переменную среды глобально или при запуске приложения.
https_proxy=http://127.0.0.1:8000 node axios.mjs
Получать
node-fetch
Аналогично , Got не поддерживает указание прокси-сервера с помощью переменных среды. Вместо этого необходимо создать пользовательский агент и передать его в запрос.
Ниже приведен пример использования Got с прокси-сервером разработки.
import got from 'got';
import { HttpsProxyAgent } from 'https-proxy-agent';
(async () => {
// Create a custom agent pointing to Dev Proxy
const agent = new HttpsProxyAgent('http://127.0.0.1:8000');
const result = await got('https://jsonplaceholder.typicode.com/posts', {
// Pass the agent to the fetch method
agent: {
https: agent
},
// Disable certificate validation
https: {
rejectUnauthorized: false
}
}).json();
console.log(JSON.stringify(result, null, 2));
})();
SuperAgent
SuperAgent
не поддерживает указание прокси-сервера с помощью переменных среды. Чтобы использовать прокси-сервер разработки с SuperAgent, необходимо установить подключаемый superagent-proxy
модуль и настроить прокси-сервер с помощью proxy
метода.
const superagent = require('superagent');
require('superagent-proxy')(superagent);
(async () => {
const result = await superagent
.get('https://jsonplaceholder.typicode.com/posts')
.proxy('http://127.0.0.1:8000')
// Disable certificate validation
.disableTLSCerts();
console.log(JSON.stringify(result.body, null, 2));
})();
Известные проблемы
При использовании прокси-сервера разработки с Node.js могут возникнуть следующие проблемы.
Ошибок: UNABLE_TO_VERIFY_LEAF_SIGNATURE
При использовании прокси-сервера разработки с Node.js возникает ошибка, аналогичная следующим:
/Users/user/my-app/node_modules/node-fetch/lib/index.js:1501
reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
^
FetchError: request to https://jsonplaceholder.typicode.com/posts failed, reason: unable to verify the first certificate
at ClientRequest.<anonymous> (/Users/user/my-app/node_modules/node-fetch/lib/index.js:1501:11)
at ClientRequest.emit (node:events:518:28)
at TLSSocket.socketErrorListener (node:_http_client:495:9)
at TLSSocket.emit (node:events:518:28)
at emitErrorNT (node:internal/streams/destroy:169:8)
at emitErrorCloseNT (node:internal/streams/destroy:128:3)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
type: 'system',
errno: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',
code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
}
Чтобы устранить эту проблему, необходимо задать для переменной NODE_TLS_REJECT_UNAUTHORIZED
среды значение 0
. Его можно определить глобально или в строке при запуске приложения.
NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js