Menggunakan Dev Proxy dengan aplikasi Node.js

Sekilas
Tujuan: Mengonfigurasi aplikasi Node.js untuk menggunakan Dev Proxy
Waktu: 10 menit
Prasyarat:Menyiapkan Proksi Dev, aplikasi Node.js

Cara Anda merutekan permintaan Node.js melalui Dev Proxy bergantung pada versi Node.js Anda dan pustaka yang Anda gunakan untuk membuat permintaan HTTP. Versi Node.js terbaru dapat merutekan API asli fetch dan modul http dan https melalui proksi yang ditentukan dalam variabel lingkungan. Untuk versi Node.js yang lebih lama dan untuk pustaka lain, Anda mengonfigurasi proksi dalam kode Anda, atau menggunakan global-agent paket untuk mengaktifkan dukungan proksi dengan perubahan kode minimal.

Pendekatan apa pun yang Anda gunakan, Node.js harus mempercayai sertifikat akar Dev Proxy untuk membuat permintaan HTTPS melalui Dev Proxy. Untuk informasi selengkapnya, lihat Mempercayai sertifikat Dev Proxy.

Percayai sertifikat Proksi Dev

Node.js tidak menggunakan penyimpanan sertifikat sistem operasi secara default, sehingga tidak mempercayai sertifikat akar Dev Proxy bahkan setelah Anda mempercayainya di komputer Anda. Alih-alih menonaktifkan validasi sertifikat, tambahkan sertifikat akar Dev Proxy ke sertifikat yang dipercayai Node.js menggunakan variabel lingkungan NODE_EXTRA_CA_CERTS.

NODE_EXTRA_CA_CERTS memerlukan sertifikat dalam format PEM. Saat Dev Proxy berjalan, dapatkan token API menggunakan devproxy api token, dan unduh sertifikat akar dalam format PEM menggunakan DEV Proxy API:

TOKEN=$(devproxy api token)
curl -H "Authorization: Bearer $TOKEN" -o dev-proxy-ca.pem "http://127.0.0.1:8897/proxy/rootCertificate?format=crt"

Jika Anda menggunakan PowerShell, jalankan:

$token = devproxy api token
Invoke-WebRequest -Headers @{ Authorization = "Bearer $token" } -OutFile dev-proxy-ca.pem -Uri "http://127.0.0.1:8897/proxy/rootCertificate?format=crt"

Kemudian, arahkan NODE_EXTRA_CA_CERTS variabel lingkungan ke file yang diunduh saat Anda memulai aplikasi:

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node index.js

Node.js hanya membaca NODE_EXTRA_CA_CERTS saat proses dimulai, sehingga Anda tidak dapat mengaturnya dari kode Anda. Setiap penginstalan Dev Proxy menggunakan sertifikat akarnya sendiri. Jika Anda membuat ulang sertifikat, misalnya menggunakan devproxy cert remove dan devproxy cert ensure, unduh lagi.

API pengambilan Node.js asli

Dimulai dengan Node.js v24.0.0 dan v22.21.0, API asli fetch dapat menggunakan proksi yang ditentukan dalam variabel lingkungan HTTP_PROXY, HTTPS_PROXY, dan NO_PROXY. Dimulai dengan Node.js v24.5.0 dan v22.21.0, hal yang sama berlaku untuk http modul dan https . Node.js mengabaikan variabel ini kecuali Anda mengaktifkan dukungan proksi dengan mengatur variabel lingkungan NODE_USE_ENV_PROXY ke 1 atau dengan memulai Node.js dengan flag --use-env-proxy.

Anda tidak perlu mengubah kode untuk menggunakan Dev Proxy dengan API asli fetch :

(async () => {
  const result = await fetch('https://jsonplaceholder.typicode.com/posts');
  const jsonResult = await result.json();
  console.log(JSON.stringify(jsonResult, null, 2));
})();

Saat memulai aplikasi Anda, aktifkan dukungan proksi, tentukan Dev Proxy sebagai proksi, dan percayai sertifikat akar Dev Proxy:

NODE_USE_ENV_PROXY=1 HTTPS_PROXY=http://127.0.0.1:8000 HTTP_PROXY=http://127.0.0.1:8000 NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node index.js

Atau, gunakan bendera --use-env-proxy alih-alih variabel lingkungan NODE_USE_ENV_PROXY:

HTTPS_PROXY=http://127.0.0.1:8000 HTTP_PROXY=http://127.0.0.1:8000 NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node --use-env-proxy index.js

Note

Dukungan proksi bawaan sedang dalam pengembangan aktif di Node.js. Untuk memeriksa apakah versi Node.js Anda mendukungnya, jalankan node --version. Jika Anda menggunakan versi yang lebih lama, gunakan undici paket atau global-agent paket seperti yang dijelaskan di bagian berikut.

Gunakan API fetch asli dengan versi Node.js yang lebih lama

Jika Anda menggunakan versi Node.js yang tidak mendukung NODE_USE_ENV_PROXY, gunakan EnvHttpProxyAgent dari undici paket, yang mengimplementasikan API asli fetch di Node.js. EnvHttpProxyAgent membaca pengaturan proksi dari variabel lingkungan HTTP_PROXY, HTTPS_PROXY, dan NO_PROXY. Atur sebagai dispatcher global di awal aplikasi Anda:

import { EnvHttpProxyAgent, setGlobalDispatcher } from 'undici';
setGlobalDispatcher(new EnvHttpProxyAgent());

(async () => {
  const result = await fetch('https://jsonplaceholder.typicode.com/posts');
  const jsonResult = await result.json();
  console.log(JSON.stringify(jsonResult, null, 2));
})();

Saat memulai aplikasi Anda, tentukan Dev Proxy sebagai proksi dan percayai sertifikat akar Dev Proxy:

HTTPS_PROXY=http://127.0.0.1:8000 HTTP_PROXY=http://127.0.0.1:8000 NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node index.mjs

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 variabel lingkungan GLOBAL_AGENT_HTTP_PROXY dan percayai sertifikat akar Dev Proxy.

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem 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));
})();

Saat memulai aplikasi Anda, percayai sertifikat akar Proksi Dev:

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node index.js

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

https_proxy Tentukan variabel lingkungan baik secara global atau saat memulai aplikasi Anda, dan percayai sertifikat root Dev Proxy.

https_proxy=http://127.0.0.1:8000 NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem 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 request
    agent: {
      https: agent
    }
  }).json();
  console.log(JSON.stringify(result, null, 2));
})();

Saat memulai aplikasi Anda, percayai sertifikat root Dev Proxy:

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node got.mjs

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');
  console.log(JSON.stringify(result.body, null, 2));
})();

Saat memulai aplikasi Anda, percayai sertifikat akar Dev Proxy:

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node superagent.js

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

Kesalahan ini berarti bahwa Node.js tidak mempercayai sertifikat akar Dev Proxy. Untuk memperbaiki masalah ini, unduh sertifikat akar Dev Proxy dan atur NODE_EXTRA_CA_CERTS variabel lingkungan ke jalur file yang diunduh saat memulai aplikasi Anda. Untuk informasi selengkapnya, lihat Mempercayai sertifikat Proksi Dev.

NODE_EXTRA_CA_CERTS=./dev-proxy-ca.pem node index.js

Warning

Hindari mengatur NODE_TLS_REJECT_UNAUTHORIZED menjadi 0 untuk mengatasi kesalahan ini. Ini menonaktifkan validasi sertifikat untuk semua permintaan HTTPS yang dilakukan aplikasi Anda.

Lihat juga