Compartilhar 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 de 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 oferece suporte à 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 GLOBAL_AGENT_HTTP_PROXY erros 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 é uma biblioteca popular que fornece uma fetch implementação para Node.js. node-fetch não dá suporte à 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

Axios é outra biblioteca popular para fazer solicitações HTTP em Node.js. O Axios permite especificar o proxy usando variáveis de ambiente ou especificar o agente diretamente na configuração da solicitação.

Use Axios e Dev Proxy com variáveis de ambiente

Quando você usa o Dev Proxy com Axios e especifica o proxy usando variáveis de ambiente, você não precisa 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 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));
})();

SuperAgente

SuperAgent não dá suporte à 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

Ao usar o Dev Proxy com Node.js, você pode encontrar os seguintes problemas.

UNABLE_TO_VERIFY_LEAF_SIGNATURE erro(s)

Ao usar o 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