Belajar ExpressJS - Arsitektur & Konsep
Episode 2 of 28

Belajar ExpressJS - Arsitektur & Konsep

Membedah arsitektur Express dari request pipeline, objek req dan res, middleware chaining dengan next(), hingga hirarki App, Router, dan middleware — konsep inti yang menjadi fondasi semua episode berikutnya.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Setelah di episode 1 kita memahami sejarah dan posisi Express di 2026, saatnya memahami cara kerjanya dari dalam. Episode 2 adalah episode paling konseptual di seluruh series — semua yang akan kalian tulis mulai episode 3 sampai episode 27 adalah variasi dari satu pola: request mengalir melalui pipeline middleware.

Mengapa ini penting? Karena kesalahan paling umum developer Express bukan di sintaks, melainkan di urutan dan konsep alur: middleware yang dipasang di tempat salah, next() yang tidak dipanggil, atau handler yang memproses request sebelum body di-parsing. Memahami pipeline sejak awal akan menghemat puluhan jam debugging.

Arsitektur Inti: App, Router, Middleware

Express memiliki tiga lapisan yang bekerja bersama:

  • App — objek utama express(). Pemilik global konfigurasi, mount point, dan daftar middleware level app.
  • Router — pemisah pipeline untuk sekelompok route (misalnya semua route /users), yang di-mount ke app (dibahas penuh di episode 8).
  • Middleware — fungsi yang memproses request secara berurutan dan menentukan kapan request berlanjut ke langkah berikutnya.
100%

Setiap request yang masuk akan melewati lapisan-lapisan ini dari atas ke bawah sampai ada yang menghasilkan response atau next() tidak lagi dipanggil.

Objek Request dan Response

Express menerima dua objek inti di setiap handler:

Request (req)

Objek req membungkus request HTTP mentah dan menambahkan properti hasil parsing:

PropertiIsiDibahas di
req.paramsPath parameters, misal :idEpisode 4, 6
req.queryQuery string yang di-parseEpisode 4, 6
req.bodyBody request (setelah middleware parser)Episode 5, 6
req.headersHeader HTTP (lowercase key)Episode 6
req.ipAlamat IP clientEpisode 6

Response (res)

Objek res adalah kendaraan untuk mengirim response:

  • res.status(201).json(data) — mengirim JSON dengan status tertentu.
  • res.redirect(url) — memindahkan client ke URL lain.
  • res.send(...) — mengirim response dengan tipe yang disimpulkan.

Detail lengkap kedua objek ini dibahas di episode 6; di sini yang perlu diingat adalah keduanya objek yang sama yang disalurkan sepanjang pipeline — middleware bisa menambahkan data ke req (misalnya req.user) yang lalu dibaca handler di bawahnya.

Middleware Chaining dan next()

Fungsi Middleware

Middleware hanyalah fungsi biasa dengan tiga argumen:

JSStruktur dasar middleware
function myMiddleware(req, res, next) {
  console.log(`${req.method} ${req.url}`)
  next()
}

Fungsi ini melakukan sesuatu (boleh memodifikasi req/res), lalu memanggil next() untuk meneruskan kontrol ke middleware berikutnya. Jika next() tidak dipanggil, request macet — ini salah satu bug paling umum.

Aturan Emas Middleware

Ada dua kemungkinan jalan yang diambil sebuah middleware:

  1. Memanggil next() → request lanjut ke langkah berikutnya.
  2. Mengakhiri request sendiri (misal res.json(...) atau res.redirect(...)) → pipeline berhenti di sini.
JSContoh middleware menghentikan pipeline
function requireAuth(req, res, next) {
  if (!req.headers.authorization) {
    return res.status(401).json({ error: "Unauthorized" })
  }
  next()
}

Perhatikan return sebelum res.status(...) — tanpa return, kode di bawahnya tetap dieksekusi dan next() dipanggil setelah response dikirim, yang menghasilkan error "headers already sent".

Error-First Middleware

Middleware error memiliki empat argumen dan dikenali dari jumlah parameternya:

JSMiddleware error dengan 4 argumen
app.use((err, req, res, next) => {
  console.error(err)
  res.status(500).json({ error: "Internal Server Error" })
})

Express membedakan middleware normal (3 argumen) dari error handler (4 argumen) murni dari length fungsi. Saat middleware memanggil next(err), Express melompat langsung ke middleware error terdekat — seluruh pipeline normal dilewati. Kita bedah topik ini penuh di episode 7.

Hirarki dan Scope

app.use() bisa dipasang dengan prefix path, membatasi cakupan middleware:

JSapp.use dengan scope
app.use("/api", myMiddleware)   // hanya untuk path yang diawali /api
app.use(myMiddleware)           // untuk semua request

Middleware yang dipasang di app berlaku untuk seluruh request; middleware yang dipasang di router hanya untuk request yang masuk ke router tersebut. Ini kunci pemahaman episode 8 saat kita memecah aplikasi menjadi modul-modul.

Important

Urutan pemasangan middleware sangat menentukan perilaku. Parser body yang dipasang setelah route handler tidak akan pernah dijalankan untuk route itu — body tetap kosong. Sepanjang series ini, kalian akan selalu melihat urutan: parser → logging → custom middleware → router → error handler.

Penutup

Episode 2 membedah fondasi arsitektur Express: request yang mengalir melalui pipeline App → Router → Middleware → Handler, objek req/res sebagai media komunikasi, serta peran next() sebagai pengendali alur.

Inti yang harus dibawa pulang:

  • Arsitektur Express adalah middleware pipeline: setiap request mengalir dari atas ke bawah.
  • req dan res dibawa sepanjang pipeline; middleware bisa memperkaya req untuk handler di bawahnya.
  • Middleware wajib memanggil next() atau mengakhiri response — tidak boleh keduanya bolak-balik secara tidak disengaja.
  • Error middleware punya 4 argumen dan dipanggil saat ada yang memanggil next(err).
  • Urutan pemasangan middleware menentukan hasil akhir.

Di episode 3 selanjutnya kita akan menulis kode pertama: setup project dan Hello World — dari npm init, menginstall Express 5, menyusun struktur folder routes/controllers/models/middleware, hingga menjalankan server pertama dengan node --watch. Sampai jumpa di episode 3!