Delen via


Dev Proxy gebruiken met Node.js toepassingen

Er is geen standaardmethode voor het inschakelen van proxy's voor Node.js toepassingen. Of u proxy kunt gebruiken, is afhankelijk van de bibliotheek die u gebruikt om HTTP-aanvragen te doen. Normaal gesproken moet u uw code bijwerken om de proxy te configureren. U kunt het global-agent pakket echter gebruiken om proxyondersteuning in te schakelen voor uw Node.js toepassing met minimale codewijzigingen.

Systeemeigen Node.js API ophalen

In v17.5.0 introduceert Node.js experimentele ondersteuning voor de fetch API. Helaas is deze API nog steeds beperkt en biedt geen ondersteuning voor het configureren van een proxy. Als u Dev Proxy wilt gebruiken met Node.js, moet u een andere bibliotheek gebruiken voor het maken van HTTP-aanvragen.

global-agent

global-agent is een populaire bibliotheek die een globale HTTP/HTTPS-agent biedt voor Node.js. Hiermee kunt u de proxy opgeven met behulp van omgevingsvariabelen. Het voordeel van het gebruik global-agent is dat u niet hoeft te wijzigen hoe u HTTP-aanvragen in uw toepassing verzendt om Dev Proxy te gebruiken.

Hier volgt een voorbeeld van hoe u kunt gebruiken global-agent in een Node.js toepassing die gebruikmaakt node-fetchvan:

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

U kunt als volgt gebruiken global-agent met Node.js en de standaardmodule 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);
  });
});

Wanneer u uw toepassing start, geeft u de proxy op met behulp van de GLOBAL_AGENT_HTTP_PROXY omgevingsvariabele en negeert u certificaatfouten.

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

node-fetch

node-fetch is een populaire bibliotheek die een fetch implementatie biedt voor Node.js. node-fetch biedt geen ondersteuning voor het opgeven van de proxy met behulp van omgevingsvariabelen. In plaats daarvan moet u een aangepaste agent maken en deze doorgeven aan de fetch methode.

Hier volgt een voorbeeld van hoe u met Dev Proxy kunt gebruiken node-fetch door een agent te definiƫren met behulp van het https-proxy-agent pakket.

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 is een andere populaire bibliotheek voor het maken van HTTP-aanvragen in Node.js. Met Axios kunt u de proxy opgeven met behulp van omgevingsvariabelen of de agent rechtstreeks in de aanvraagconfiguratie opgeven.

Axios en Dev Proxy gebruiken met omgevingsvariabelen

Wanneer u Dev Proxy met Axios gebruikt en de proxy opgeeft met behulp van omgevingsvariabelen, hoeft u uw code niet te wijzigen. U hoeft alleen maar de https_proxy omgevingsvariabele in te stellen en Axios gebruikt deze om aanvragen te doen.

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

Geef de https_proxy omgevingsvariabele globaal op of bij het starten van uw app.

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

Kreeg

Vergelijkbaar met node-fetch, Got biedt geen ondersteuning voor het opgeven van de proxy met behulp van omgevingsvariabelen. In plaats daarvan moet u een aangepaste agent maken en deze doorgeven aan de aanvraag.

Hier volgt een voorbeeld van hoe u Got kunt gebruiken met 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 biedt geen ondersteuning voor het opgeven van de proxy met behulp van omgevingsvariabelen. Als u Dev Proxy wilt gebruiken met SuperAgent, moet u de superagent-proxy invoegtoepassing installeren en de proxy configureren met behulp van de proxy methode.

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

Bekende problemen

Wanneer u Dev Proxy gebruikt met Node.js, kunnen de volgende problemen optreden.

Fout UNABLE_TO_VERIFY_LEAF_SIGNATURE

Wanneer u Dev Proxy gebruikt met Node.js, krijgt u een foutmelding die vergelijkbaar is met:

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

U kunt dit probleem oplossen door de NODE_TLS_REJECT_UNAUTHORIZED omgevingsvariabele in te stellen op 0. U kunt deze globaal of inline definiƫren bij het starten van uw app.

NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js