Berdasarkan fondasi yang kuat sekalipun, aplikasi tetap sesekali berperilaku di luar dugaan: server mendadak diam, berkas yang “jelas ada” dilaporkan hilang, atau await tidak pernah kembali. Debugging adalah keterampilan tersendiri, dan keterampilan itu mempunyai metode — bukan sekadar menabur console.log sambil berharap kebetulan. Chapter ini adalah halaman rujukan untuk momen-momen tersebut: cara membaca pesan error sampai tuntas, tabel pemetaan gejala umum ke penyebab dan langkah pemeriksaannya, daftar alat bawaan, serta urutan kerja yang teratur. Semua rujukan menunjuk ke chapter Course yang membahas akar masalahnya secara mendalam.

Membaca Pesan Error Secara Utuh #

Error Node.js datang dalam dua keluarga yang perlu dibedakan karena tempat mencarinya berbeda:

KeluargaPola namaContohDaftar resmi
Error sistemKapital tanpa awalan, warisan sistem operasiENOENT, ECONNREFUSED, EADDRINUSEBagian Common System Errors pada halaman errors referensi API
Error internal Node.jsBerawalan ERR_ERR_MODULE_NOT_FOUND, ERR_INVALID_ARG_TYPEIndeks kode error pada halaman errors yang sama

Error sistem membawa properti tambahan yang mempersempit pencarian. Berkas baca-error.mjs berikut memicu error sistem secara sengaja lalu mencetak seluruh properti pentingnya:

js
import { readFile } from "node:fs/promises";

// Memicu error sistem secara sengaja: berkas ini memang tidak ada
try {
  await readFile("tidak-ada.txt", "utf8");
} catch (e) {
  console.log(`name    : ${e.name}`);
  console.log(`code    : ${e.code}`);
  console.log(`errno   : ${e.errno}`);
  console.log(`syscall : ${e.syscall}`);
  console.log(`path    : ${e.path}`);
}

Output yang Dihasilkan:

text
name    : Error
code    : ENOENT
errno   : -2
syscall : open
path    : tidak-ada.txt

Mari kita telaah properti yang tercetak:

  1. code (ENOENT): kode paling penting untuk dicari; artinya no such file or directory — target tidak ditemukan.
  2. errno (-2): nomor error sistem operasi; nilainya berbeda-beda antar platform, jadi code selalu lebih aman dipakai dalam kode.
  3. syscall (open): operasi sistem yang sedang berjalan ketika kegagalan terjadi — di sini proses sedang membuka berkas.
  4. path (tidak-ada.txt): target yang diminta apa adanya, termasuk bila ia berupa path relatif; membandingkannya dengan isi folder sering langsung menyingkap salah ketik.

Keluarga ERR_ juga bisa diperiksa dengan pola yang sama. Snippet berikut mencoba mengimpor module yang tidak ada dan mencetak hanya kodenya:

js
try {
  const modul = await import("./tidak-ada.mjs");
  console.log(modul);
} catch (e) {
  console.log(`code    : ${e.code}`);
}

Output yang Dihasilkan:

text
code    : ERR_MODULE_NOT_FOUND

Tabel Gejala Umum #

Tabel berikut memetakan gejala yang paling sering dijumpai sepanjang Course ke dugaan penyebab, langkah pemeriksaan, dan chapter yang membahas akar masalahnya. Gunakan sebagai titik awal, bukan putusan akhir:

GejalaKemungkinan penyebabLangkah pemeriksaanRujukan chapter
Server berhenti merespons seluruh permintaanEvent loop terblokir operasi sinkron yang berat di dalam handlerPeriksa handler terakhir yang menangani permintaan; profil proses; pindahkan beban CPU ke workerEvent Loop, Worker Threads, Profiling CPU dan Heap
ERR_MODULE_NOT_FOUND saat aplikasi dinyalakanPath relatif salah, ekstensi berkas terlewat pada ESM, atau dependency belum terpasangBandingkan specifier import dengan aturan resolusi; jalankan npm install; periksa package.jsonResolusi Module, npm dan Dependencies
ECONNREFUSED dari klien HTTP atau TCPServer tujuan belum berjalan, atau alamat dan port salahCocokkan host dan port; pastikan listen() berhasil sebelum klien menghubungiMembangun TCP Client, HTTP Client dengan fetch
EADDRINUSE saat listen()Port masih dipakai proses lainHentikan proses lama atau pilih port lain; pasang handler 'error' pada server untuk memutuskan strategiMembangun TCP Server
ENOENT untuk berkas yang terasa sudah adaPath relatif dihitung dari current working directory, bukan lokasi berkas kodeCetak process.cwd() dan bandingkan; bangun path absolut dari import.meta.urlMembaca Berkas, Module path
await menggantung tanpa hasilJalur resolve/reject tidak pernah tercapai, atau event yang dijanjikan tidak pernah terbitAudit setiap cabang kode agar selalu menyelesaikan promise; pastikan emitter masih hidupPromise dan async-await, Promise untuk Tugas Paralel
Proses berhenti karena unhandled rejectionRantai promise ditolak tanpa catch di salah satu cabangTambahkan catch pada rantai; pasang pemantau unhandledRejection untuk mencatat sebelum keluarError pada Kode Asynchronous
Callback tidak pernah dipanggilCabang penanganan error lupa memanggil callback-nyaAudit semua cabang function async; terapkan konvensi error-first secara konsistenPola Callback
Perilaku berbeda antara mesin kantor dan serverEnvironment variable tidak terbaca atau bernilai berbedaCetak daftar kunci process.env; jalankan dengan --env-file agar konfigurasi eksplisitEnvironment Variables, Konfigurasi Aplikasi
Hasil async berubah antar eksekusiUrutan operasi paralel tidak ditentukan sehingga terjadi race conditionRangkai ketergantungan antar langkah dengan await; jangan berasumsi urutan selesaiPromise untuk Tugas Paralel

Alat Bawaan untuk Menyelidiki #

Setelah gejala terpetakan, Node.js menyediakan beberapa alat tanpa instalasi tambahan. Panduan resmi Debugging Node.js menjelaskan keseluruhannya; berikut ringkasan perannya:

AlatKegunaanRujukan chapter
node --inspectMenyambungkan inspector untuk menjeda eksekusi, memeriksa variabel, dan melangkah baris demi barisDebugging dengan node –inspect
Modul node:inspectorMengendalikan sesi debugging lewat programDebugging dengan node –inspect
Stack traceMembaca urutan pemanggilan yang berujung pada errorMembaca Stack Trace
console.error dan console.tableMencatat ke kanal stderr dan menabulasikan data saat menyelidikiTeknik Logging, stdin, stdout, dan stderr
node --watchMenjalankan ulang otomatis saat berkas berubah, mempercepat siklus cek-perbaikiWatch Mode

Urutan Kerja yang Teratur #

Saat gejala belum jelas termasuk baris mana pun di tabel, kembalikan diri ke urutan kerja yang sederhana namun disiplin:

  1. Bangkitkan ulang secara andal. Gejala yang hanya muncul kadang-kadang perlu dikecilkan dulu menjadi langkah-langkah yang selalu memunculkannya.
  2. Baca pesan error sampai habis — kode, syscall, dan baris pertama stack trace — sebelum menyusun dugaan apa pun.
  3. Persempit wilayah salah dengan mengomentari atau melewati bagian kode, memakai git untuk membandingkan versi yang masih sehat, atau console.log yang ditempatkan strategis di batas-batas lapisan.
  4. Uji satu dugaan pada satu waktu. Mengubah banyak hal sekaligus membuat kita tidak tahu mana yang benar-benar berpengaruh.
  5. Perbaiki, lalu kunci dengan test. Test regresi memastikan gejala yang sama tidak kembali diam-diam — materinya ada pada Chapter Konsep Testing.

Dengan peta ini, mayoritas kejadian sehari-hari bisa dipersempit ke satu penyebab dalam beberapa langkah pemeriksaan. Sebagian kecil sisanya menuntut ketelitian dari sisi lain: aplikasi yang benar secara logika tetap bisa bocor jika dihadapkan pada pihak yang sengaja mencari celah — itulah medan Chapter Panduan Keamanan.