Bagikan melalui


Menggunakan Dev Proxy dengan aplikasi Node.js

Tidak ada cara standar untuk mengaktifkan proksi untuk aplikasi Node.js. Apakah Anda dapat menggunakan proksi, tergantung pada pustaka yang Anda gunakan untuk membuat permintaan HTTP. Biasanya, Anda perlu memperbarui kode untuk mengonfigurasi proksi. Namun, Anda dapat menggunakan global-agent paket untuk mengaktifkan dukungan proksi untuk aplikasi Node.js Anda dengan perubahan kode minimal.

API pengambilan Node.js asli

Di v17.5.0, Node.js memperkenalkan dukungan eksperimental untuk fetch API. Sayangnya, API ini masih terbatas dan tidak mendukung konfigurasi proksi. Jika Anda ingin menggunakan Dev Proxy dengan Node.js, Anda perlu menggunakan pustaka yang berbeda untuk membuat permintaan HTTP.

global-agent

global-agent adalah pustaka populer yang menyediakan agen HTTP/HTTPS global untuk Node.js. Ini memungkinkan Anda menentukan proksi menggunakan variabel lingkungan. Manfaat penggunaannya global-agent adalah Anda tidak perlu mengubah cara Anda mengeluarkan permintaan HTTP di aplikasi Anda untuk menggunakan Dev Proxy.

Berikut adalah contoh bagaimana Anda dapat menggunakan global-agent dalam aplikasi Node.js yang menggunakan 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));
})();

Berikut adalah cara anda dapat menggunakan global-agent dengan Node.js dan modul standar 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);
  });
});

Saat memulai aplikasi Anda, tentukan proksi menggunakan GLOBAL_AGENT_HTTP_PROXY variabel lingkungan dan abaikan kesalahan sertifikat.

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

node-fetch

node-fetch adalah pustaka populer yang menyediakan fetch implementasi untuk Node.js. node-fetch tidak mendukung menentukan proksi menggunakan variabel lingkungan. Sebagai gantinya, Anda perlu membuat agen kustom dan meneruskannya ke metode fetch.

Berikut adalah contoh bagaimana Anda dapat menggunakan node-fetch dengan Dev Proxy dengan menentukan agen menggunakan https-proxy-agent paket.

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 adalah pustaka populer lainnya untuk membuat permintaan HTTP di Node.js. Axios memungkinkan Anda menentukan proksi menggunakan variabel lingkungan atau menentukan agen langsung dalam konfigurasi permintaan.

Menggunakan Axios dan Dev Proxy dengan variabel lingkungan

Saat Anda menggunakan Dev Proxy dengan Axios dan menentukan proksi menggunakan variabel lingkungan, Anda tidak perlu mengubah kode Anda. Yang perlu Anda lakukan adalah mengatur https_proxy variabel lingkungan dan Axios menggunakannya untuk membuat permintaan.

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

Tentukan https_proxy variabel lingkungan baik secara global atau saat memulai aplikasi Anda.

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

dapat

Mirip node-fetchdengan , Got tidak mendukung menentukan proksi menggunakan variabel lingkungan. Sebagai gantinya, Anda perlu membuat agen kustom dan meneruskannya ke permintaan.

Berikut adalah contoh bagaimana Anda dapat menggunakan 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 tidak mendukung menentukan proksi menggunakan variabel lingkungan. Untuk menggunakan Dev Proxy dengan SuperAgent, Anda perlu menginstal superagent-proxy plugin dan mengonfigurasi proksi menggunakan proxy metode .

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

Masalah umum

Saat Anda menggunakan Dev Proxy dengan Node.js, Anda mungkin mengalami masalah berikut.

UNABLE_TO_VERIFY_LEAF_SIGNATURE kesalahan

Saat Anda menggunakan Dev Proxy dengan Node.js, Anda mendapatkan kesalahan yang mirip dengan:

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

Untuk memperbaiki masalah ini, Anda perlu mengatur NODE_TLS_REJECT_UNAUTHORIZED variabel lingkungan ke 0. Anda dapat menentukannya secara global, atau langsung saat memulai aplikasi Anda.

NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js