Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
На первый взгляд
Цель: Настройка приложений Node.js для использования прокси-сервера разработки
Время: 10 минут
Предварительные требования:Настройка прокси-сервера разработки, Node.js приложения
Нет стандартного способа включения прокси-серверов для Node.js приложений. Можно ли использовать прокси-сервер, зависит от библиотеки, которую вы используете для выполнения HTTP-запросов. Как правило, необходимо обновить код для настройки прокси-сервера. Однако пакет можно использовать global-agent для включения поддержки прокси-сервера для приложения Node.js с минимальными изменениями кода.
Нативный fetch 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
Node-fetch — это популярная библиотека, которая предоставляет fetch реализацию для Node.js.
node-fetch не поддерживает указание прокси-сервера с помощью переменных среды. Вместо этого необходимо создать пользовательский агент и передать его методу fetch .
Пример того, как можно использовать node-fetch с Dev Proxy, определив агента с помощью пакета 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
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
См. также
- Использование прокси-сервера разработки с приложениями Node.js в контейнерах Docker — настройка Docker
- Использование прокси-сервера разработки с функциями Azure JavaScript — Функции Azure
- Глоссарий — терминология прокси для разработки