Używanie serwera proxy deweloperów z aplikacjami Node.js
Nie ma standardowego sposobu włączania serwerów proxy dla aplikacji Node.js. Niezależnie od tego, czy możesz używać serwera proxy, zależy od biblioteki, której używasz do wykonywania żądań HTTP. Zazwyczaj należy zaktualizować kod, aby skonfigurować serwer proxy. Możesz jednak użyć global-agent
pakietu, aby włączyć obsługę serwera proxy dla aplikacji Node.js z minimalnymi zmianami kodu.
Natywny interfejs API pobierania Node.js
W wersji 17.5.0 Node.js wprowadza eksperymentalną obsługę interfejsu fetch
API. Niestety ten interfejs API jest nadal ograniczony i nie obsługuje konfigurowania serwera proxy. Jeśli chcesz używać serwera proxy deweloperskiego z Node.js, musisz użyć innej biblioteki do tworzenia żądań HTTP.
global-agent
global-agent
to popularna biblioteka, która udostępnia globalnego agenta HTTP/HTTPS dla Node.js. Umożliwia określenie serwera proxy przy użyciu zmiennych środowiskowych. Zaletą użycia global-agent
jest to, że nie trzeba zmieniać sposobu wystawiania żądań HTTP w aplikacji w celu korzystania z serwera proxy deweloperskiego.
Oto przykład użycia w aplikacji Node.js korzystającej node-fetch
z global-agent
polecenia :
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));
})();
Poniżej przedstawiono sposób użycia z global-agent
Node.js i modułem standardowym 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);
});
});
Podczas uruchamiania aplikacji określ serwer proxy przy użyciu zmiennej środowiskowej GLOBAL_AGENT_HTTP_PROXY
i ignoruj błędy certyfikatu.
NODE_TLS_REJECT_UNAUTHORIZED=0 GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8000 node global-node-fetch.mjs
node-fetch
node-fetch to popularna biblioteka udostępniająca implementację fetch
Node.js. node-fetch
nie obsługuje określania serwera proxy przy użyciu zmiennych środowiskowych. Zamiast tego należy utworzyć agenta niestandardowego i przekazać go do fetch
metody .
Oto przykład użycia z node-fetch
serwerem proxy deweloperów przez zdefiniowanie agenta https-proxy-agent
przy użyciu pakietu.
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 to kolejna popularna biblioteka do tworzenia żądań HTTP w Node.js. Axios umożliwia określenie serwera proxy przy użyciu zmiennych środowiskowych lub określenie agenta bezpośrednio w konfiguracji żądania.
Używanie platformy Axios i serwera proxy deweloperów ze zmiennymi środowiskowymi
Jeśli używasz serwera proxy deweloperskiego z axiosem i określasz serwer proxy przy użyciu zmiennych środowiskowych, nie musisz zmieniać kodu. Wszystko, co musisz zrobić, to ustawić zmienną https_proxy
środowiskową, a axios używa go do tworzenia żądań.
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));
})();
Określ zmienną https_proxy
środowiskową globalnie lub podczas uruchamiania aplikacji.
https_proxy=http://127.0.0.1:8000 node axios.mjs
Dostał
Podobnie jak node-fetch
w przypadku elementu , nie obsługuje określania serwera proxy przy użyciu zmiennych środowiskowych. Zamiast tego należy utworzyć agenta niestandardowego i przekazać go do żądania.
Oto przykład użycia opcji Got with Dev Proxy (Got with Dev Proxy):
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
nie obsługuje określania serwera proxy przy użyciu zmiennych środowiskowych. Aby używać serwera proxy dev z serwerem SuperAgent, należy zainstalować wtyczkę superagent-proxy
i skonfigurować serwer proxy przy użyciu proxy
metody .
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));
})();
Znane problemy
W przypadku korzystania z serwera proxy deweloperskiego z Node.js mogą wystąpić następujące problemy.
Błąd UNABLE_TO_VERIFY_LEAF_SIGNATURE
W przypadku korzystania z serwera proxy deweloperskiego z Node.js występuje błąd podobny do następującego:
/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'
}
Aby rozwiązać ten problem, należy ustawić zmienną środowiskową NODE_TLS_REJECT_UNAUTHORIZED
na 0
wartość . Możesz zdefiniować ją globalnie lub w wierszu podczas uruchamiania aplikacji.
NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js