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 0
de entorno en . Puede definirla globalmente o en línea al iniciar la aplicación.
NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js