Verwenden von Dev Proxy mit Node.js-Anwendungen
Es gibt keine Standardmethode zum Aktivieren von Proxys für Node.js Anwendungen. Ob Sie Proxy verwenden können, hängt von der Bibliothek ab, die Sie verwenden, um HTTP-Anforderungen zu stellen. Normalerweise müssen Sie Ihren Code aktualisieren, um den Proxy zu konfigurieren. Sie können das global-agent
Paket jedoch verwenden, um die Proxyunterstützung für Ihre Node.js-Anwendung mit minimalen Codeänderungen zu aktivieren.
Native Node.js-Abruf-API
In v17.5.0 führt Node.js experimentelle Unterstützung für die fetch
API ein. Leider ist diese API immer noch eingeschränkt und unterstützt die Konfiguration eines Proxys nicht. Wenn Sie Dev Proxy mit Node.js verwenden möchten, müssen Sie eine andere Bibliothek zum Erstellen von HTTP-Anforderungen verwenden.
global-agent
global-agent
ist eine beliebte Bibliothek, die einen globalen HTTP/HTTPS-Agent für Node.js bereitstellt. Sie können den Proxy mithilfe von Umgebungsvariablen angeben. Der Vorteil der Verwendung global-agent
besteht darin, dass Sie nicht ändern müssen, wie Sie HTTP-Anforderungen in Ihrer Anwendung ausgeben, um Dev Proxy zu verwenden.
Nachfolgend finden Sie ein Beispiel für die Verwendung global-agent
in einer Node.js Anwendung, die Folgendes verwendet 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));
})();
Hier erfahren Sie, wie Sie mit Node.js und dem Standardmodul https
arbeiten global-agent
können:
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);
});
});
Geben Sie beim Starten der Anwendung den Proxy mithilfe der Umgebungsvariable GLOBAL_AGENT_HTTP_PROXY
an, und ignorieren Sie Zertifikatfehler.
NODE_TLS_REJECT_UNAUTHORIZED=0 GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8000 node global-node-fetch.mjs
node-fetch
node-fetch ist eine beliebte Bibliothek, die eine fetch
Implementierung für Node.js bereitstellt. node-fetch
unterstützt die Angabe des Proxys nicht mithilfe von Umgebungsvariablen. Stattdessen müssen Sie einen benutzerdefinierten Agent erstellen und an die fetch
Methode übergeben.
Hier ist ein Beispiel dafür, wie Sie mit Dev Proxy verwenden node-fetch
können, indem Sie einen Agent mithilfe des https-proxy-agent
Pakets definieren.
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 ist eine weitere beliebte Bibliothek zum Erstellen von HTTP-Anforderungen in Node.js. Mit Axios können Sie den Proxy mithilfe von Umgebungsvariablen angeben oder den Agent direkt in der Anforderungskonfiguration angeben.
Verwenden von Axios und Dev Proxy mit Umgebungsvariablen
Wenn Sie Dev Proxy mit Axios verwenden und den Proxy mithilfe von Umgebungsvariablen angeben, müssen Sie Ihren Code nicht ändern. Sie müssen lediglich die Umgebungsvariable https_proxy
festlegen, und Axios verwendet sie, um Anforderungen zu stellen.
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));
})();
Geben Sie die https_proxy
Umgebungsvariable entweder global oder beim Starten der App an.
https_proxy=http://127.0.0.1:8000 node axios.mjs
Bekam
Ähnlich wie node-fetch
, Got unterstützt die Angabe des Proxys nicht mithilfe von Umgebungsvariablen. Stattdessen müssen Sie einen benutzerdefinierten Agent erstellen und an die Anforderung übergeben.
Hier ist ein Beispiel für die Verwendung von Got mit 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
unterstützt die Angabe des Proxys nicht mithilfe von Umgebungsvariablen. Um Dev Proxy mit SuperAgent zu verwenden, müssen Sie das superagent-proxy
Plug-In installieren und den Proxy mithilfe der proxy
Methode konfigurieren.
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));
})();
Bekannte Probleme
Wenn Sie Dev Proxy mit Node.js verwenden, treten möglicherweise die folgenden Probleme auf.
UNABLE_TO_VERIFY_LEAF_SIGNATURE
Fehler
Wenn Sie Dev Proxy mit Node.js verwenden, erhalten Sie eine Fehlermeldung wie:
/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'
}
Um dieses Problem zu beheben, müssen Sie die Umgebungsvariable NODE_TLS_REJECT_UNAUTHORIZED
auf 0
. Sie können sie global oder beim Starten der App inline definieren.
NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js