Episode ini merapikan runtime aplikasi: memuat konfigurasi dari environment variables dan file .env, membedakan NODE_ENV, logging terstruktur dengan pino, serta memahami level log untuk produksi. Semua ini adalah syarat aplikasi yang bisa di-deploy.

Aplikasi yang hanya berjalan di laptop pengembangnya belum bisa disebut aplikasi. Aplikasi nyata dijalankan di banyak environment — local, staging, produksi — masing-masing dengan konfigurasi berbeda: port, koneksi database, kunci rahasia. Konfigurasi ini tidak boleh di-hardcode.
Episode 12 membahas tiga pilar pengaturan runtime: environment variables dan file .env, pembedaan NODE_ENV untuk tiap lingkungan, serta logging terstruktur dengan pino. Setelah episode ini, aplikasi kalian siap menempuh perjalanan menuju produksi.
Environment variable adalah pasangan nama dan nilai yang diinjeksi ke proses. Node.js menyediakannya lewat process.env. Nilai rahasia seperti JWT_SECRET dari episode 11 dan DATABASE_URL hidup di sini — bukan di kode.
Cara termudah untuk mengelolanya saat development adalah file .env:
node --env-file=.env app.jsFlag node --env-file=.env app.js membuat Node.js membaca file .env dan mengekspornya ke process.env — tanpa paket tambahan. Tambahkan .env ke .gitignore agar rahasia tidak pernah masuk ke repository.
const port = Number(process.env.PORT ?? 3000);
const nama = process.env.APP_NAME ?? "belajar-nodejs";
console.log(nama, port);Pola process.env.PORT ?? 3000 memakai default ketika variabel tidak diset. Konversi Number(...) penting karena semua nilai process.env berbentuk string. Operator nullish ?? hanya menggantikan null atau undefined, jadi string kosong tetap dihormati.
NODE_ENV adalah konvensi yang memberi tahu aplikasi environment saat ini: development, test, atau production. Banyak framework memakai nilainya untuk mengaktifkan atau mematikan fitur:
NODE_ENV=production node app.js
NODE_ENV=test node --testNODE_ENV=production node app.js membuat aplikasi berjalan dalam mode produksi — Express mematikan detail stack trace yang bocor di respons error. Nilai default di development adalah development jika tidak diset secara eksplisit.
if (process.env.NODE_ENV === "production") {
app.set("trust proxy", 1);
}Gunakan NODE_ENV untuk perbedaan perilaku, bukan untuk menyimpan rahasia — rahasia tetap di process.env terpisah. Contoh di atas hanya mengaktifkan trust proxy di produksi, karena header proxy palsu berbahaya ketika langsung terpapar internet.
console.log mengeluarkan teks yang sulit diurai mesin. Di produksi, kalian butuh logging terstruktur — setiap baris log berupa JSON yang bisa difilter, dikumpulkan, dan di-query. pino adalah pilihan paling populer dan sangat cepat:
npm install pinonpm install pino menambahkan logger dengan dukungan JSON dan level log. pino sangat cepat karena memakai serialisasi yang dioptimalkan — penting untuk server yang melayani ribuan request.
import pino from "pino";
const logger = pino({ level: process.env.LOG_LEVEL ?? "info" });
logger.info("Server mulai");
logger.info({ userId: 42 }, "Pengguna masuk");
logger.error({ err: new Error("koneksi gagal") }, "Database tidak merespons");pino({ level: process.env.LOG_LEVEL ?? "info" }) membuat logger dengan level bawaan info. Perhatikan perbedaan bentuk: logger.info({ userId: 42 }, "Pesan") menempelkan konteks terstruktur, dan logger.error({ err: ... }, "...") menyertakan objek error lengkap dengan stack trace — jauh lebih berguna untuk debugging daripada teks polos.
pino mengikuti level log standar, dari paling tenang ke paling detail: fatal, error, warn, info, debug, trace. Prinsipnya:
error dan fatal: hal yang perlu perhatian segera.warn: kondisi abnormal tapi tidak fatal.info: peristiwa normal seperti server mulai.debug: detail untuk pengembangan, biasanya dimatikan di produksi.Atur level lewat LOG_LEVEL — produksi biasanya info atau warn, development sering debug. Log yang terlalu banyak justru membuat sinyal penting tenggelam.
Jangan bikin beberapa logger dengan konfigurasi berbeda-beda. Buat satu modul logger dan impor di seluruh aplikasi, sehingga level dan formatnya konsisten. Di episode 22, log JSON ini akan langsung dialirkan ke sistem observability seperti Loki atau OpenSearch.
Inti yang harus dibawa pulang:
process.env, bukan di kode.node --env-file=.env memuat file .env tanpa paket tambahan.NODE_ENV membedakan development, test, dan production.console.log dengan serialisasi cepat.fatal hingga trace; sesuaikan LOG_LEVEL per environment.Di episode 13 selanjutnya kita akan membahas database relasional vs NoSQL dalam Node.js — karakteristik SQL dan ACID, model document dari NoSQL, pertimbangan memilih berdasarkan data dan skenario, serta bagaimana keduanya digunakan dari kode Node.js. Ini pembuka fase data dari series ini.