Express adalah framework kecil di atas modul http. Kamu cukup bilang "kalau ada GET /catatan, jawab begini", dan Express yang mencocokkan tiap request ke jawabannya. Bayangin resepsionis kantor dengan buku daftar: tiap tamu menyebut keperluan dan tujuannya, resepsionis membuka daftar dari atas dan mengantar ke orang yang tepat. Daftar itu adalah route-mu, dan orang yang menjawab adalah handler.
🧪 Tebakan cepat: tanpa
app.use(express.json()), client mengirimPOST /catatandengan body JSON. Apa isireq.body? Tebak dulu, jawabannya ada di bagian "Membaca body: express.json()".
Memasang Express
Express bukan modul bawaan, jadi pasang dulu dari npm di folder proyek:
npm install express
npm mengunduhnya ke folder node_modules dan mencatatnya di package.json sebagai "express": "^5.2.1". Versi yang terpasang sekarang adalah Express 5. Banyak tutorial masih menulis Express 4, dan bedanya dibahas di bawah.
Server catatan, versi Express
server.js dari pelajaran sebelumnya ditulis ulang jadi app.js:
const express = require("express");
const app = express();
app.use(express.json());
const catatan = [
{ id: 1, judul: "Belanja", isi: "beli beras 5 kg" },
{ id: 2, judul: "Belajar", isi: "bab Node.js" },
];
app.get("/catatan", (req, res) => {
res.json(catatan);
});
app.get("/catatan/:id", (req, res) => {
const item = catatan.find((c) => c.id === Number(req.params.id));
if (!item) {
return res.status(404).json({ error: "Catatan tidak ditemukan" });
}
res.json(item);
});
app.post("/catatan", (req, res) => {
const { judul, isi } = req.body;
const baru = { id: catatan.length + 1, judul, isi };
catatan.push(baru);
res.status(201).json(baru);
});
app.listen(3000, () => {
console.log("Server jalan di http://localhost:3000");
});
require("express")mengembalikan sebuah function, danexpress()memanggilnya untuk membuat aplikasi,app.app.get(path, handler)mendaftarkan route: requestGETke path itu dijawab handler itu. Mendaftarkan belum menjalankan apa pun. Handler baru dipanggil saat request-nya datang.app.postsama, untukPOST.res.json(data)melakukan tiga hal sekaligus:JSON.stringify, headerContent-Type: application/json; charset=utf-8, lalu mengirim dan menutup jawabannya.res.status(201).json(baru)mengganti status dulu.201 Createdartinya ada yang baru dibuat.app.listen(3000)menyalakan server di port 3000, sama sepertiserver.listen.
Mencocokkan request ke route
| Request | Route yang cocok | Jawaban |
|---|---|---|
GET /catatan |
GET /catatan |
200, dua catatan |
GET /catatan/2 |
GET /catatan/:id, req.params.id = "2" |
200, {"id":2,"judul":"Belajar","isi":"bab Node.js"} |
GET /catatan/9 |
GET /catatan/:id, req.params.id = "9" |
404, {"error":"Catatan tidak ditemukan"} |
GET /catatan?urut=judul |
GET /catatan, req.query.urut = "judul" |
200, dua catatan |
DELETE /catatan/1 |
gak ada | 404 dari Express: Cannot DELETE /catatan/1 |
:idadalah route parameter: dia menangkap satu bagian path, apa pun isinya, kereq.params.id. Isinya selalu teks, jadiNumber(...)dulu sebelum dibandingkan denganidyang berupa angka.- Query string gak ikut dicocokkan. Isinya masuk ke
req.query. - Kalau gak ada route yang cocok, Express menjawab sendiri dengan 404 dan halaman HTML kecil berisi
Cannot DELETE /catatan/1. Handler-mu gak dipanggil sama sekali. - Express gak membedakan huruf besar-kecil dan garis miring di ujung:
/Catatan/2/tetap cocok dengan/catatan/:id.
Membaca body: express.json()
Untuk mengirim catatan baru, client mengirim body JSON:
curl -i -X POST http://localhost:3000/catatan -H "Content-Type: application/json" -d '{"judul":"Olahraga","isi":"lari 5 km"}'
app.use(express.json()) memasang middleware, fungsi yang jalan untuk tiap request sebelum route-nya. Dia membaca body JSON dan menaruh hasilnya di req.body, jadi handler mendapat { judul: "Olahraga", isi: "lari 5 km" } dan menjawab 201 dengan {"id":3,"judul":"Olahraga","isi":"lari 5 km"}.
Tanpa baris itu, gak ada yang membaca body-nya, dan req.body isinya undefined. Itu jawaban tebakannya. Baris const { judul, isi } = req.body; lalu melempar TypeError: Cannot destructure property 'judul' of 'req.body' as it is undefined., dan Express menjawab 500 Internal Server Error. Bedanya dengan modul http: Express menangkap error dari handler, jadi server-nya tetap hidup.
Di latihan: route tanpa request sungguhan
Simulator latihan gak mengirim request ke aplikasimu, jadi tiga baris output-nya kamu cetak sendiri. Kode awal sudah membuat app dan mencetak Express app dibuat!. Daftarkan app.get("/hello", ...) yang menjawab res.json({ message: "Halo Dunia!" }), lalu cetak dua baris berikutnya:
Express app dibuat!
Route terdaftar: GET /hello
Response: {"message":"Halo Dunia!"}
📌 Express 4 atau 5?
npm install express sekarang memasang Express 5. Yang beda dari tutorial Express 4, untuk hal yang dibahas di sini:
- Handler
asyncyang melempar error ditangkap Express dan dijawab 500. Di Express 4, error itu lolos dari Express, dan di Node versi sekarang seluruh server ikut mati. - Kalau body-nya bukan JSON,
express.json()di Express 5 membiarkanreq.bodytetapundefined. Express 4 mengisinya{}. req.querycuma bisa dibaca, dan?a[b]=1gak lagi diubah jadi object bersarang.- Path dengan bintang harus diberi nama:
/*di Express 4 jadi/*splatdi Express 5.
⚠️ Jebakan yang sering ketemu
- Lupa
app.use(express.json()).req.bodyjadiundefined, dan membacanya berakhir dengan 500. - Membandingkan
req.params.idlangsung dengan angka.2 === "2"hasilnyafalse, jadiGET /catatan/2selalu 404. PakaiNumber(req.params.id). - Lupa
returnsebelumres.status(404).json(...). Kodenya jalan terus keres.json(item), padahal jawabannya sudah dikirim. Satu request, satu jawaban. - Data hilang saat server restart. Array
catatancuma ada di memori. Catatan baru dariPOSThilang begitu server dimatikan, sampai nanti kita pakai database.
TL;DR: Pasang dengan npm install express (sekarang Express 5), muat dengan const express = require("express"), buat aplikasi dengan const app = express(). Daftarkan route dengan app.get dan app.post, jawab dengan res.json(data) atau res.status(201).json(data), dan nyalakan dengan app.listen(3000). :id di path masuk ke req.params.id (sebagai teks), query string ke req.query. Pasang app.use(express.json()) supaya body JSON terbaca di req.body. Tanpa itu req.body adalah undefined. Request tanpa route dijawab Express sendiri dengan 404.