Argumen command line cocok untuk masukan yang berubah setiap kali program dijalankan, tetapi kurang tepat untuk konfigurasi yang jarang berubah: alamat database, mode aplikasi, atau batas jumlah baris. Untuk kebutuhan itu, sistem operasi menyediakan kanal lain bernama environment variable — kumpulan pasangan kunci-nilai yang disiapkan shell untuk setiap proses baru. Node.js membuka akses ke kumpulan tersebut lewat process.env. Pada chapter ini kita belajar membacanya dengan nilai default, menulisnya dari dalam script, mengaturnya dari shell, dan mengikuti konvensi NODE_ENV yang dipakai seluruh ekosistem.

Salinan yang Diterima Saat Proses Lahir #

Setiap proses menerima salinan environment milik shell induknya pada saat dijalankan — setelah proses berjalan, perubahan di shell tidak lagi terlihat, dan sebaliknya. Property process.env tampak seperti object biasa: membaca process.env.NAMA menghasilkan string nilai atau undefined bila variable tersebut tidak ada. Menariknya, variable yang tidak pernah kita atur memang tidak ada — program di bawah ini berjalan di lingkungan yang bersih dari ketiga variable yang dibacanya, sehingga seluruh nilai default ikut bekerja:

js
const mode = process.env.NODE_ENV || "development";
const tampil = Number(process.env.TAMPILAN_MAX || 10);
const pemilik = process.env.PEMILIK_DATA || "Budi";

console.log("mode      :", mode);
console.log("tampil max:", tampil);
console.log("pemilik   :", pemilik);

Output yang Dihasilkan:

text
mode      : development
tampil max: 10
pemilik   : Budi

Tiga nilai tercetak semuanya berasal dari sisi kanan operator || karena NODE_ENV, TAMPILAN_MAX, dan PEMILIK_DATA tidak ditemukan. Pola process.env.X || nilaiDefault adalah idiom paling umum di ekosistem Node.js, dan ada dua jebakan kecil di dalamnya. Pertama, nilai environment selalu string — angka perlu melewati Number() sebelum dipakai berhitung, seperti pada TAMPILAN_MAX. Kedua, operator || juga mengganti string kosong "" dengan nilai default, karena string kosong termasuk nilai falsy; bila "" adalah nilai sah untuk program kita, gunakan ?? yang hanya mengganti null dan undefined.

process.env juga bisa ditulis dari dalam kode — berguna untuk mengonfigurasi library yang membaca environment-nya sendiri, atau menyiapkan konfigurasi bagi proses anak yang akan kita lahirkan. Berkas tulis-env.mjs mencoba penulisan, pembacaan, dan penghapusan:

js
process.env.MODE_LAPORAN = "bulanan";
process.env.BATAS_BARIS = 25;

console.log("MODE_LAPORAN:", process.env.MODE_LAPORAN);
console.log("BATAS_BARIS :", process.env.BATAS_BARIS, `(${typeof process.env.BATAS_BARIS})`);

delete process.env.MODE_LAPORAN;
console.log("setelah delete:", process.env.MODE_LAPORAN);

Output yang Dihasilkan:

text
MODE_LAPORAN: bulanan
BATAS_BARIS : 25 (string)
setelah delete: undefined

Perhatikan baris BATAS_BARIS : 25 (string): kita menugaskan angka 25, yang tersimpan adalah string "25" — penugasan ke process.env selalu mengubah nilai menjadi string. Operator delete kemudian melepas MODE_LAPORAN sehingga pembacaan berikutnya menghasilkan undefined. Yang perlu diingat: penulisan ini hanya mengubah salinan milik proses kita sendiri, bukan environment shell induk — setelah program berakhir, variable tersebut ikut hilang bersama prosesnya.

Mengatur dari Shell #

Cara paling umum memberi nilai adalah lewat shell, tepat sebelum nama perintah: NAMA=nilai node berkas.mjs. Berkas laporan.mjs membaca dua variable konfigurasi:

js
const mode = process.env.MODE_LAPORAN || "uji";
const batas = Number(process.env.BATAS_BARIS ?? 5);

console.log(`membuat laporan dalam mode ${mode}`);
console.log(`maksimal ${batas} baris per berkas`);

Jalankan dengan variable yang diatur di depan perintah:

bash
MODE_LAPORAN=produksi node laporan.mjs

Output yang Dihasilkan:

text
membuat laporan dalam mode produksi
maksimal 5 baris per berkas

Nilai produksi mengalir dari shell ke process.env.MODE_LAPORAN, sementara BATAS_BARIS tetap tidak diatur sehingga ?? memilih angka 5. Tanpa pengaturan apa pun, program kembali ke mode uji:

bash
node laporan.mjs

Output yang Dihasilkan:

text
membuat laporan dalam mode uji
maksimal 5 baris per berkas

Bentuk NAMA=nilai perintah hanya berlaku untuk satu perintah itu saja. Untuk beberapa perintah berurutan, gunakan export NAMA=nilai lebih dulu agar variable menetap di sesi shell — di Windows Command Prompt padanannya adalah set NAMA=nilai. Alat CI seperti GitHub Actions juga menyediakan kolom environment variable yang disuntikkan ke proses dengan mekanisme yang sama persis.

Konvensi NODE_ENV dan Berkas .env #

Satu nama variable menempati posisi istimewa di ekosistem: NODE_ENV. Nilainya lazim "development", "production", atau "test", dan banyak framework membacanya untuk mengubah perilaku — Express, misalnya, mematikan pesan error yang detail saat NODE_ENV=production. Variable ini tidak diatur otomatis oleh Node.js; nilainya sepenuhnya tanggung jawab kita, dan itulah sebabnya pola process.env.NODE_ENV || "development" begitu umum ditemui.

bash
node --env-file=.env laporan.mjs

Dengan argumen dan environment variable, program kita sudah bisa menerima kedua jenis masukan standar CLI. Bab selanjutnya menutup rangkaian komunikasi ini dari sisi keluaran: tiga stream standar stdin, stdout, dan stderr yang menjadi pintu masuk dan keluar setiap alat command line.

Referensi lanjutan untuk topik chapter ini: