Routing adalah salah satu konsep terpenting di Express.js. Ini adalah mekanisme yang menentukan bagaimana aplikasi merespons request dari klien ke endpoint tertentu — kombinasi dari URL path dan HTTP method.
Di artikel ini kita bahas semua yang perlu kamu tahu tentang routing di Express, dari route sederhana hingga route parameter dinamis dan Express Router.
HTTP Methods di Express
Express mendukung semua HTTP method standar:
app.get('/path', handler); // Ambil data
app.post('/path', handler); // Kirim/buat data
app.put('/path', handler); // Update data (replace)
app.patch('/path', handler); // Update data (partial)
app.delete('/path', handler); // Hapus data
app.all('/path', handler); // Semua method
Setiap method sesuai dengan konvensi REST API yang akan kita bahas lebih dalam di artikel mendatang.
Route Path
Path route bisa berupa string literal, pola string, atau regex.
String Literal (Paling Umum)
app.get('/pengguna', (req, res) => {
res.send('Daftar pengguna');
});
app.get('/pengguna/profil', (req, res) => {
res.send('Profil pengguna');
});
Pola String
// Cocok dengan /abe, /abcde, dsb. (? berarti karakter opsional)
app.get('/ab?cde', handler);
// Cocok dengan /abcde, /abbcde, /abbbcde, dsb.
app.get('/ab+cde', handler);
// Cocok dengan /abcde, /abXYZcde, dsb.
app.get('/ab*cde', handler);
Regex
// Cocok dengan path yang mengandung "fly"
app.get(/fly/, (req, res) => {
res.send('Path mengandung "fly"');
});
Route Parameters
Route parameter memungkinkan kamu menangkap nilai dinamis dari URL. Tandai dengan tanda titik dua (:) di depan nama parameter.
// :id adalah parameter dinamis
app.get('/pengguna/:id', (req, res) => {
const userId = req.params.id;
res.send(`Profil pengguna dengan ID: ${userId}`);
});
Akses http://localhost:3000/pengguna/42 → response: Profil pengguna dengan ID: 42
Multiple Parameters
app.get('/users/:userId/books/:bookId', (req, res) => {
const { userId, bookId } = req.params;
res.json({
user: userId,
book: bookId
});
});
Akses /users/10/books/55 → { "user": "10", "book": "55" }
Parameter Opsional
// bookId bersifat opsional
app.get('/users/:userId/books/:bookId?', (req, res) => {
const { userId, bookId } = req.params;
if (bookId) {
res.send(`User ${userId}, Buku ${bookId}`);
} else {
res.send(`Semua buku milik User ${userId}`);
}
});
Query String
Query string adalah parameter yang dikirim setelah tanda ? di URL.
// URL: /produk?kategori=elektronik&halaman=2
app.get('/produk', (req, res) => {
const { kategori, halaman } = req.query;
res.json({
kategori: kategori || 'semua',
halaman: parseInt(halaman) || 1
});
});
Route Handlers (Multiple Callbacks)
Sebuah route bisa punya lebih dari satu handler. Ini berguna untuk memisahkan logika, misalnya validasi dan proses utama.
// Middleware validasi
const validasiId = (req, res, next) => {
const id = parseInt(req.params.id);
if (isNaN(id) || id <= 0) {
return res.status(400).json({ error: 'ID tidak valid' });
}
req.userId = id; // teruskan ke handler berikutnya
next();
};
// Handler utama
const ambilPengguna = (req, res) => {
res.json({ id: req.userId, nama: 'Budi' });
};
// Gabungkan
app.get('/pengguna/:id', validasiId, ambilPengguna);
Express Router — Modularisasi Route
Saat aplikasi semakin besar, semua route dalam satu file index.js akan berantakan. Express Router memungkinkan kamu memisahkan route ke file-file terpisah.
Struktur Project
project/
├── routes/
│ ├── pengguna.js
│ └── produk.js
└── index.js
routes/pengguna.js
const express = require('express');
const router = express.Router();
// GET /pengguna
router.get('/', (req, res) => {
res.json([
{ id: 1, nama: 'Budi' },
{ id: 2, nama: 'Sari' }
]);
});
// GET /pengguna/:id
router.get('/:id', (req, res) => {
res.json({ id: req.params.id, nama: 'Budi' });
});
// POST /pengguna
router.post('/', (req, res) => {
res.status(201).json({ pesan: 'Pengguna berhasil dibuat' });
});
// DELETE /pengguna/:id
router.delete('/:id', (req, res) => {
res.json({ pesan: `Pengguna ${req.params.id} dihapus` });
});
module.exports = router;
routes/produk.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.json([{ id: 1, nama: 'Laptop', harga: 15000000 }]);
});
router.get('/:id', (req, res) => {
res.json({ id: req.params.id, nama: 'Laptop', harga: 15000000 });
});
module.exports = router;
index.js — Daftarkan Semua Router
const express = require('express');
const app = express();
const penggunaRouter = require('./routes/pengguna');
const produkRouter = require('./routes/produk');
app.use(express.json());
// Mount router ke prefix path
app.use('/pengguna', penggunaRouter);
app.use('/produk', produkRouter);
// Route utama
app.get('/', (req, res) => {
res.json({ pesan: 'API Express.js Berjalan' });
});
// 404 handler
app.use((req, res) => {
res.status(404).json({ error: 'Endpoint tidak ditemukan' });
});
app.listen(3000, () => {
console.log('Server berjalan di port 3000');
});
Sekarang endpoint yang tersedia:
GET /pengguna→ daftar penggunaGET /pengguna/5→ pengguna dengan ID 5POST /pengguna→ buat pengguna baruDELETE /pengguna/5→ hapus pengguna ID 5GET /produk→ daftar produkGET /produk/1→ produk dengan ID 1
Urutan Route Matters
Express memproses route dari atas ke bawah. Route yang lebih spesifik harus didefinisikan sebelum yang umum:
// BENAR - spesifik dulu, umum kemudian
app.get('/pengguna/baru', (req, res) => {
res.send('Form pengguna baru');
});
app.get('/pengguna/:id', (req, res) => {
res.send(`Pengguna ID: ${req.params.id}`);
});
Jika dibalik, request ke /pengguna/baru akan ditangkap oleh route /:id dengan id = 'baru'.
Kesimpulan
Routing adalah fondasi dari setiap aplikasi Express. Dengan memahami route parameters, query string, multiple handlers, dan Express Router, kamu sudah bisa membangun struktur routing yang bersih dan scalable.
Di artikel berikutnya, kita akan bahas Middleware — konsep paling powerful di Express yang memungkinkan kamu menambahkan logika di antara request dan response.
Kiki/🎮🍉⌨️🍩💻