Usar o Dev Proxy com aplicativos Node.js
Não há uma maneira padrão de habilitar proxies para aplicativos Node.js. Se você pode usar proxy, depende da biblioteca que você está usando para fazer solicitações HTTP. Normalmente, você precisa atualizar seu código para configurar o proxy. No entanto, você pode usar o pacote para habilitar o global-agent
suporte a proxy para seu aplicativo Node.js com alterações mínimas de código.
API de busca de Node.js nativa
Na v17.5.0, Node.js introduz suporte experimental para a fetch
API. Infelizmente, essa API ainda é limitada e não suporta a configuração de um proxy. Se você quiser usar o Dev Proxy com Node.js, precisará usar uma biblioteca diferente para fazer solicitações HTTP.
global-agent
global-agent
é uma biblioteca popular que fornece um agente HTTP/HTTPS global para Node.js. Ele permite que você especifique o proxy usando variáveis de ambiente. A vantagem de usar global-agent
é que você não precisa alterar a forma como emite solicitações HTTP em seu aplicativo para usar o Dev Proxy.
Aqui está um exemplo de como você pode usar global-agent
em um aplicativo 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));
})();
Veja como você pode usar global-agent
com o Node.js e o módulo padrão 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);
});
});
Ao iniciar seu aplicativo, especifique o proxy usando a variável de ambiente e ignore os erros de GLOBAL_AGENT_HTTP_PROXY
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 é uma biblioteca popular que fornece uma fetch
implementação para Node.js. node-fetch
não suporta a especificação do proxy usando variáveis de ambiente. Em vez disso, você precisa criar um agente personalizado e passá-lo para o fetch
método.
Aqui está um exemplo de como você pode usar node-fetch
com o Dev Proxy definindo um agente usando o https-proxy-agent
pacote.
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
O Axios é outra biblioteca popular para fazer solicitações HTTP no Node.js. O Axios permite especificar o proxy usando variáveis de ambiente ou especificar o agente diretamente na configuração da solicitação.
Usar Axios e Dev Proxy com variáveis de ambiente
Quando você usa o Dev Proxy com o Axios e especifica o proxy usando variáveis de ambiente, não é necessário alterar seu código. Tudo o que você precisa fazer é definir a variável de ambiente e o https_proxy
Axios a usa para fazer solicitações.
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 a https_proxy
variável de ambiente globalmente ou ao iniciar seu aplicativo.
https_proxy=http://127.0.0.1:8000 node axios.mjs
Tem
Semelhante ao node-fetch
, Got não suporta a especificação do proxy usando variáveis de ambiente. Em vez disso, você precisa criar um agente personalizado e passá-lo para a solicitação.
Aqui está um exemplo de como você pode usar o Got com o 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));
})();
SuperAgente
SuperAgent
não suporta a especificação do proxy usando variáveis de ambiente. Para usar o Dev Proxy com o SuperAgent, você precisa instalar o superagent-proxy
plug-in e configurar o proxy usando o 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 conhecidos
Quando você usa o Dev Proxy com Node.js, você pode encontrar os seguintes problemas.
UNABLE_TO_VERIFY_LEAF_SIGNATURE
erro
Quando você usa Dev Proxy com Node.js, você recebe um erro semelhante a:
/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 corrigir esse problema, você precisa definir a NODE_TLS_REJECT_UNAUTHORIZED
variável de ambiente como 0
. Você pode defini-lo globalmente ou em linha ao iniciar seu aplicativo.
NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js