process.env adalah object dengan satu property untuk setiap environment variable yang diberikan shell ke program Node.js-mu: process.env.PORT, process.env.DATABASE_URL, dan seterusnya. Variabel yang tidak diatur terbaca sebagai undefined, dan variabel yang diatur selalu berupa string. Baca sekali saat startup, beri nilai default, lalu ubah ke tipe yang kamu butuhkan.
Hasilnya shop on port 8080 in eu-west (REGION tidak pernah diatur, jadi nilai default-nya yang dipakai), lalu string number: variabelnya berupa teks sampai Number() mengubahnya. Hapus dua baris pengisian pertama lalu jalankan lagi untuk melihat semua nilai default.
Mengatur environment variable di shell
Variabelnya berasal dari tempat Node.js dijalankan. Di terminal:
// macOS and Linux: for one command
PORT=8080 NODE_ENV=production node app.js
// macOS and Linux: for the rest of the terminal session
export PORT=8080
// Windows PowerShell
$env:PORT = "8080"; node app.js
// Windows cmd.exe
set PORT=8080
node app.js
Platform hosting (Heroku, Render, Vercel, Docker, Kubernetes) punya halaman pengaturan atau file untuk hal yang sama; kodemu membacanya dengan cara yang sama.
Semuanya string
Di sinilah sebagian besar bug process.env berasal. 'false' dan '0' adalah string yang tidak kosong, jadi keduanya truthy:
Pengecekan naif mencetak debug is ON untuk variabel yang diisi false, jadi bandingkan dengan string persis yang kamu harapkan. Untuk angka, Number(process.env.X) mengubah nilai yang tidak ada menjadi NaN, jadi pasang nilai default sebelum mengubahnya, seperti yang dilakukan contoh pertama dengan ??.
NODE_ENV
NODE_ENV adalah konvensi, bukan fitur Node.js: Node.js tidak pernah mengaturnya. Library-lah yang membacanya. Express, misalnya, menyembunyikan stack trace dari halaman error saat nilainya production, dan banyak alat melewati pengecekan yang hanya untuk development.
Hasilnya mode: production dan verbose logs: false; ganti 'production' dengan 'development' dan baris kedua ikut berubah. Pakai saja production, development, dan test, karena library mengecek kata-kata persis itu.
File .env: --env-file dan dotenv
Mengetik setiap variabel sebelum node lama-lama melelahkan. File .env menyimpannya di folder proyekmu, satu per baris:
// .env
PORT=8080
DATABASE_URL=postgres://localhost/shop
API_KEY=dev-key-123
Node.js 20.6 ke atas membacanya dengan sebuah flag, tanpa perlu package:
node --env-file=.env app.js
Di versi yang lebih lama, atau kalau kamu lebih suka, install package dotenv (npm install dotenv) dan muat di bagian paling atas file entry-mu, sebelum ada kode yang membaca process.env:
require('dotenv').config(); // copies .env into process.env
console.log(process.env.PORT); // 8080
Keduanya tidak menimpa variabel yang sudah diatur di shell, jadi pengaturan production menang atas isi file.
Gagal lebih awal saat variabel tidak ada
URL database yang tidak ada seharusnya menghentikan program saat startup dengan pesan yang jelas, bukan membuatnya crash di request pertama sejam kemudian:
Hasilnya Missing environment variables: API_KEY; tambahkan process.env.API_KEY = 'test'; di bagian atas dan hasilnya Config OK. Di program sungguhan, ikuti pesan itu dengan process.exit(1), karena exit code yang bukan nol adalah cara script deploy atau platform container mengetahui bahwa startup gagal.
Jangan pernah commit rahasia
Masukkan .env ke .gitignore di hari kamu membuatnya. Commit .env.example yang berisi nama variabel dan nilai palsu, supaya orang lain tahu apa yang perlu diatur. Key yang pernah di-push ke repository harus dianggap bocor dan diganti, walaupun kamu menghapus commit-nya belakangan.
Pertanyaan yang sering diajukan
Kenapa process.env.MY_VAR bernilai undefined?
Variabel itu tidak diatur di shell yang menjalankan Node.js, atau diatur di terminal lain. File .env juga tidak dibaca otomatis: jalankan Node.js dengan --env-file=.env atau muat dengan dotenv sebelum kamu membaca nilainya.
Bisakah aku mengubah process.env saat program berjalan?
Bisa. Mengisi process.env.X = 'value' mengubahnya untuk proses saat ini dan untuk child process yang dijalankan sesudahnya, tetapi tidak pernah untuk shell yang menjalankan Node.js. Node.js mengubah nilai yang kamu isikan menjadi string.
Apakah nama environment variable case-sensitive?
Di Linux dan macOS, ya: PORT dan port adalah dua variabel. Di Windows tidak. Pakai saja nama huruf besar dengan garis bawah dan pertanyaan ini tidak pernah muncul.
Bisakah browser membaca process.env?
Tidak. Browser tidak punya environment variable. Alat build seperti Vite dan Next.js menyalin variabel tertentu ke kode frontend-mu saat build, yang juga berarti nilai-nilai itu bersifat publik.