Freigeben über


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