Partilhar via


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