Verwenden von Dev Proxy mit Node.js-Anwendungen

Auf einen Blick
Ziel: Konfigurieren von Node.js Anwendungen für die Verwendung von Dev Proxy
Zeit: 10 Minuten
Prerequisites:Set up Dev Proxy, Node.js Application

Wie Sie Node.js Anfragen über Dev Proxy weiterleiten, hängt von Ihrer Node.js Version und der Bibliothek ab, die Sie zum Senden von HTTP-Anfragen verwenden. Aktuelle Node.js-Versionen können die systemeigene fetch API und die Module http und https über einen Proxy weiterleiten, der in Umgebungsvariablen definiert ist. Für ältere Node.js Versionen und für andere Bibliotheken konfigurieren Sie den Proxy in Ihrem Code, oder verwenden Sie das global-agent Paket, um die Proxyunterstützung mit minimalen Codeänderungen zu aktivieren.

Je nachdem, welcher Ansatz Sie verwenden, muss Node.js dem Dev Proxy-Stammzertifikat vertrauen, um HTTPS-Anforderungen über Dev Proxy zu stellen. Weitere Informationen finden Sie unter Trust the Dev Proxy certificate.

Vertrauen Sie dem Dev Proxy-Zertifikat

Node.js verwendet standardmäßig nicht den Zertifikatspeicher des Betriebssystems, sodass es dem Dev Proxy-Stammzertifikat nicht vertraut, auch nachdem Sie es auf Ihrem Computer als vertrauenswürdig festgelegt haben. Anstatt die Zertifikatüberprüfung zu deaktivieren, fügen Sie das Dev Proxy-Stammzertifikat zu den Zertifikaten hinzu, die Node.js mithilfe der NODE_EXTRA_CA_CERTS Umgebungsvariablen als vertrauenswürdig einstuft.

NODE_EXTRA_CA_CERTS erfordert ein Zertifikat im PEM-Format. Rufen Sie während der Ausführung von Dev Proxy das API-Token ab devproxy api token, und laden Sie das Stammzertifikat im PEM-Format mithilfe der Dev Proxy-API herunter:

TOKEN=$(devproxy api token)
curl -H "Authorization: Bearer $TOKEN" -o dev-proxy-ca.pem "http://127.0.0.1:8897/proxy/rootCertificate?format=crt"

Wenn Sie PowerShell verwenden, führen Sie Folgendes aus:

$token = devproxy api token
Invoke-WebRequest -Headers @{ Authorization = "Bearer $token" } -OutFile dev-proxy-ca.pem -Uri "http://127.0.0.1:8897/proxy/rootCertificate?format=crt"

Zeigen Sie dann die Umgebungsvariable NODE_EXTRA_CA_CERTS auf die heruntergeladene Datei, wenn Sie die App starten:

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node index.js

Node.js liest NODE_EXTRA_CA_CERTS nur, wenn der Prozess startet, sodass Sie ihn nicht über Ihren Code festlegen können. Jede Dev Proxy-Installation verwendet ein eigenes Stammzertifikat. Wenn Sie das Zertifikat erneut erstellen, z. B. mit devproxy cert remove und devproxy cert ensure, laden Sie es erneut herunter.

Native Node.js fetch API

Ab Node.js v24.0.0 und v22.21.0 kann die systemeigene fetch API den in den Umgebungsvariablen HTTP_PROXY, HTTPS_PROXY und NO_PROXY definierten Proxy verwenden. Ab Node.js v24.5.0 und v22.21.0 gilt dies auch für die http- und https-Module. Node.js ignoriert diese Variablen, es sei denn, Sie aktivieren die Proxyunterstützung, indem Sie die NODE_USE_ENV_PROXY-Umgebungsvariable auf 1 festlegen oder indem Sie Node.js mit dem --use-env-proxy-Flag starten.

Sie müssen Ihren Code nicht ändern, um Dev Proxy mit der nativen fetch API zu verwenden:

(async () => {
  const result = await fetch('https://jsonplaceholder.typicode.com/posts');
  const jsonResult = await result.json();
  console.log(JSON.stringify(jsonResult, null, 2));
})();

Aktivieren Sie beim Starten der App die Proxyunterstützung, geben Sie Dev Proxy als Proxy an, und vertrauen Sie dem Dev Proxy-Stammzertifikat:

NODE_USE_ENV_PROXY=1 HTTPS_PROXY=http://127.0.0.1:8000 HTTP_PROXY=http://127.0.0.1:8000 NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node index.js

Verwenden Sie alternativ das --use-env-proxy Flag anstelle der NODE_USE_ENV_PROXY Umgebungsvariable:

HTTPS_PROXY=http://127.0.0.1:8000 HTTP_PROXY=http://127.0.0.1:8000 NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node --use-env-proxy index.js

Note

Die integrierte Proxyunterstützung befindet sich in der aktiven Entwicklung in Node.js. Um zu überprüfen, ob Ihre Node.js Version dies unterstützt, führen Sie node --version aus. Wenn Sie eine ältere Version verwenden, verwenden Sie das undici Paket oder das global-agent Paket, wie in den folgenden Abschnitten beschrieben.

Verwenden der nativen Fetch API mit älteren Node.js-Versionen

Wenn Sie eine Node.js-Version verwenden, die NODE_USE_ENV_PROXY nicht unterstützt, verwenden Sie EnvHttpProxyAgent aus dem undici-Paket, das die systemeigene fetch-API in Node.js implementiert. EnvHttpProxyAgent liest den Proxy aus den Umgebungsvariablen HTTP_PROXY, HTTPS_PROXY und NO_PROXY. Legen Sie sie als globalen Dispatcher am Anfang Ihrer App fest:

import { EnvHttpProxyAgent, setGlobalDispatcher } from 'undici';
setGlobalDispatcher(new EnvHttpProxyAgent());

(async () => {
  const result = await fetch('https://jsonplaceholder.typicode.com/posts');
  const jsonResult = await result.json();
  console.log(JSON.stringify(jsonResult, null, 2));
})();

Geben Sie beim Starten der App Dev Proxy als Proxy an, und vertrauen Sie dem Dev Proxy-Stammzertifikat:

HTTPS_PROXY=http://127.0.0.1:8000 HTTP_PROXY=http://127.0.0.1:8000 NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node index.mjs

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 von global-agent besteht darin, dass Sie nicht ändern müssen, wie Sie HTTP-Anfragen in Ihrer Anwendung senden, 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 global-agent mit Node.js und dem Standardmodul https verwenden 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 GLOBAL_AGENT_HTTP_PROXY Umgebungsvariable an, und vertrauen Sie dem Dev Proxy-Stammzertifikat.

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem 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 node-fetch mit Dev Proxy verwenden 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));
})();

Vertrauen Sie beim Starten der App dem Dev Proxy-Stammzertifikat:

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node index.js

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 Anfragen zu senden.

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, und vertrauen Sie dem Dev Proxy-Stammzertifikat.

https_proxy=http://127.0.0.1:8000 NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node axios.mjs

Got

Ähnlich wie node-fetch, Got unterstützt es nicht die Möglichkeit, den Proxy mithilfe von Umgebungsvariablen anzugeben. Stattdessen müssen Sie einen benutzerdefinierten Agenten erstellen und diesen der 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 request
    agent: {
      https: agent
    }
  }).json();
  console.log(JSON.stringify(result, null, 2));
})();

Vertrauen Sie beim Starten der App dem Dev Proxy-Stammzertifikat:

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node got.mjs

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');
  console.log(JSON.stringify(result.body, null, 2));
})();

Vertrauen Sie beim Starten der App dem Dev Proxy-Stammzertifikat:

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node superagent.js

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'
}

Dieser Fehler bedeutet, dass Node.js dem Dev Proxy-Stammzertifikat nicht vertraut. Um dieses Problem zu beheben, laden Sie das Dev Proxy-Stammzertifikat herunter, und legen Sie die NODE_EXTRA_CA_CERTS Umgebungsvariable auf den Pfad der heruntergeladenen Datei fest, wenn Sie Die App starten. Weitere Informationen finden Sie unter Trust the Dev Proxy certificate.

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node index.js

Warning

Vermeiden Sie, NODE_TLS_REJECT_UNAUTHORIZED auf 0 zu setzen, um diesen Fehler zu umgehen. Es deaktiviert die Zertifikatüberprüfung für alle HTTPS-Anforderungen, die Ihre App sendet.

Siehe auch