Sdílet prostřednictvím


Použití Dev Proxy s aplikacemi Node.js

Neexistuje žádný standardní způsob povolení proxy pro Node.js aplikace. To, jestli můžete použít proxy server, závisí na knihovně, kterou používáte k provádění požadavků HTTP. Obvykle je potřeba aktualizovat kód pro konfiguraci proxy serveru. Balíček však můžete použít global-agent k povolení podpory proxy pro vaši Node.js aplikaci s minimálními změnami kódu.

Nativní rozhraní API pro načtení Node.js

Ve verzi 17.5.0 Node.js zavádí experimentální podporu rozhraní fetch API. Toto rozhraní API je bohužel stále omezené a nepodporuje konfiguraci proxy serveru. Pokud chcete používat dev proxy se Node.js, musíte pro vytváření požadavků HTTP použít jinou knihovnu.

global-agent

global-agent je oblíbená knihovna, která poskytuje globálního agenta HTTP/HTTPS pro Node.js. Umožňuje zadat proxy pomocí proměnných prostředí. Výhodou použití global-agent je, že při používání Dev Proxy nemusíte měnit způsob vydávání požadavků HTTP ve vaší aplikaci.

Tady je příklad použití global-agent v aplikaci Node.js, která používá 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));
})();

Tady je postup global-agent použití s Node.js a standardním https modulem:

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);
  });
});

Při spuštění aplikace zadejte proxy pomocí GLOBAL_AGENT_HTTP_PROXY proměnné prostředí a ignorujte chyby certifikátu.

NODE_TLS_REJECT_UNAUTHORIZED=0 GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8000 node global-node-fetch.mjs

node-fetch

Node-fetch je oblíbená knihovna, která poskytuje fetch implementaci pro Node.js. node-fetch nepodporuje zadávání proxy serveru pomocí proměnných prostředí. Místo toho musíte vytvořit vlastního agenta a předat ho metodě fetch .

Tady je příklad použití node-fetch s dev Proxy definováním agenta pomocí https-proxy-agent balíčku.

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 je další oblíbená knihovna pro vytváření požadavků HTTP v Node.js. Axios umožňuje zadat proxy pomocí proměnných prostředí nebo určit agenta přímo v konfiguraci požadavku.

Použití Axios a Dev Proxy s proměnnými prostředí

Pokud používáte Dev Proxy s Axios a zadáváte proxy pomocí proměnných prostředí, nemusíte měnit kód. Stačí nastavit https_proxy proměnnou prostředí a Axios ji použije k provádění požadavků.

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));
})();

Zadejte proměnnou https_proxy prostředí buď globálně, nebo při spuštění aplikace.

https_proxy=http://127.0.0.1:8000 node axios.mjs

Dostal

node-fetchPodobně jako , Got nepodporuje zadávání proxy pomocí proměnných prostředí. Místo toho musíte vytvořit vlastního agenta a předat ho do požadavku.

Tady je příklad použití funkce 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 nepodporuje zadávání proxy serveru pomocí proměnných prostředí. Pokud chcete používat Dev Proxy s SuperAgent, musíte nainstalovat superagent-proxy modul plug-in a nakonfigurovat proxy pomocí 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));
})();

Známé problémy

Pokud používáte dev Proxy se službou Node.js, můžou nastat následující problémy.

Chyba UNABLE_TO_VERIFY_LEAF_SIGNATURE

Když s Node.js používáte Dev Proxy, zobrazí se podobná chyba:

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

Pokud chcete tento problém vyřešit, musíte nastavit proměnnou NODE_TLS_REJECT_UNAUTHORIZED prostředí na 0hodnotu . Můžete ho definovat globálně nebo in-line při spuštění aplikace.

NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js