Compartir a través de


Uso del proxy de desarrollo con aplicaciones de Node.js

No hay ninguna manera estándar de habilitar servidores proxy para aplicaciones Node.js. Si puede usar proxy, depende de la biblioteca que use para realizar solicitudes HTTP. Normalmente, debe actualizar el código para configurar el proxy. Sin embargo, puede usar el paquete para habilitar la global-agent compatibilidad con proxy para la aplicación de Node.js con cambios mínimos de código.

API de captura de Node.js nativa

En la versión 17.5.0, Node.js presenta compatibilidad experimental con la fetch API. Desafortunadamente, esta API sigue siendo limitada y no admite la configuración de un proxy. Si quiere usar el proxy de desarrollo con Node.js, debe usar una biblioteca diferente para realizar solicitudes HTTP.

global-agent

global-agent es una biblioteca popular que proporciona un agente HTTP/HTTPS global para Node.js. Permite especificar el proxy mediante variables de entorno. La ventaja de usar global-agent es que no es necesario cambiar cómo emite solicitudes HTTP en la aplicación para usar el proxy de desarrollo.

Este es un ejemplo de cómo puede usar global-agent en una aplicación de Node.js que usa 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));
})();

Aquí se muestra cómo puede usar global-agent con Node.js y el módulo estándar 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);
  });
});

Al iniciar la aplicación, especifique el proxy mediante la GLOBAL_AGENT_HTTP_PROXY variable de entorno y omita los errores de certificado.

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

node-fetch

node-fetch es una biblioteca popular que proporciona una fetch implementación para Node.js. node-fetch no admite la especificación del proxy mediante variables de entorno. En su lugar, debe crear un agente personalizado y pasarlo al fetch método .

Este es un ejemplo de cómo puede usar node-fetch con el proxy de desarrollo mediante la definición de un agente mediante el https-proxy-agent paquete.

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 es otra biblioteca popular para realizar solicitudes HTTP en Node.js. Axios permite especificar el proxy mediante variables de entorno o especificar el agente directamente en la configuración de la solicitud.

Uso de Axios y proxy de desarrollo con variables de entorno

Cuando se usa Dev Proxy con Axios y se especifica el proxy mediante variables de entorno, no es necesario cambiar el código. Lo único que debe hacer es establecer la https_proxy variable de entorno y Axios lo usa para realizar solicitudes.

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

Especifique la https_proxy variable de entorno globalmente o al iniciar la aplicación.

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

Tiene

De forma similar a node-fetch, Got no admite la especificación del proxy mediante variables de entorno. En su lugar, debe crear un agente personalizado y pasarlo a la solicitud.

Este es un ejemplo de cómo puede usar 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 no admite la especificación del proxy mediante variables de entorno. Para usar el proxy de desarrollo con SuperAgent, debe instalar el superagent-proxy complemento y configurar el proxy mediante el proxy método .

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

Problemas conocidos

Al usar el proxy de desarrollo con Node.js, es posible que encuentre los siguientes problemas.

UNABLE_TO_VERIFY_LEAF_SIGNATURE con error

Al usar el proxy de desarrollo con Node.js, obtendrá un error similar al siguiente:

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

Para corregir este problema, debe establecer la NODE_TLS_REJECT_UNAUTHORIZED variable 0de entorno en . Puede definirla globalmente o en línea al iniciar la aplicación.

NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js