Menu

Express Router dan Routing: Route, Params, Prefix

Route di Express terdiri dari method, path, dan handler: app.get('/users/:id', handler). Kelompokkan route yang berkaitan dalam express.Router() lalu pasang di bawah prefix dengan app.use('/api', router).

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Routing di Express memetakan method HTTP dan path ke sebuah fungsi handler: app.get('/users', handler) menjawab request GET ke /users, dan app.post(), app.put(), serta app.delete() melakukan hal yang sama untuk method lainnya. Segmen yang diawali titik dua, seperti di /users/:id, adalah parameter route yang nilainya masuk ke req.params. Supaya aplikasi yang terus tumbuh tetap rapi, taruh route yang berkaitan dalam express.Router() lalu pasang di bawah prefix dengan app.use('/api', router).

GET /users/2 menjawab {"id":2,"name":"Linus"}. Parameter route selalu berupa string, itulah sebabnya handler membandingkan dengan Number(req.params.id). Kirim POST /users dengan body {"name": "Grace"} untuk mendapat 201, lalu DELETE /users/1 dan GET /users untuk melihat daftarnya berubah.

express.Router() dengan prefix

Router adalah aplikasi mini dengan route dan middleware-nya sendiri. Path-nya relatif: route yang ditulis sebagai /:id di dalam router yang dipasang di /api/books menjawab /api/books/:id. Di proyek sungguhan, setiap router tinggal di file-nya sendiri dan diakhiri module.exports = router.

GET /api/books/1 mengembalikan {"id":1,"title":"Dune"}. router.route('/:id') menulis path-nya sekali dan merangkai satu handler per method; kirim PUT /api/books/1 dan kamu mendapat {"updated":"1"}. Ganti path pemasangannya menjadi /v2/books dan router yang sama menjawab di sana.

Urutan route: yang pertama cocok menang

Express mencoba route sesuai urutan pendaftarannya dan berhenti di route pertama yang mengirim response. Route dengan parameter menangkap apa saja di posisinya, jadi path tetap yang didaftarkan sesudahnya tidak pernah tercapai:

GET /users/new menjawab {"route":"/users/:id","id":"new"}: route dengan parameter didaftarkan lebih dulu dan mengambilnya. Pindahkan route /users/new ke atas /users/:id lalu jalankan lagi untuk mendapat {"route":"/users/new"}. Lalu kirim GET /books untuk mencapai handler 404 di bagian bawah.

Handler 404

Express menjawab request yang tidak cocok dengan halaman HTML miliknya sendiri, Cannot GET /books. Untuk API kamu biasanya ingin JSON, jadi tambahkan app.use() tanpa path sebagai route paling akhir, seperti di blok di atas. Handler ini berjalan hanya saat setiap route sebelumnya meneruskan request-nya. Error yang dilempar handler adalah kasus lain dengan handler empat argumennya sendiri, dibahas di penanganan error Express.

Path route di Express 5

Express 5 mengubah sintaks path, dan sebagian besar potongan kode di internet ditulis untuk Express 4:

PolaExpress 4Express 5
Path apa sajaapp.get('*', fn)app.get('/*splat', fn)
Parameter opsional/users/:id?/users{/:id}
Pola pada parameter/users/:id(\\d+)Tidak didukung; cek nilainya di handler

* sendirian atau ? setelah parameter melempar TypeError saat route didaftarkan, jadi aplikasinya tidak mau jalan.

Kesalahan umum

Mendaftarkan handler 404 lebih dulu. app.use() tanpa path cocok dengan semuanya, jadi setiap request mendapat 404. Taruh di bagian paling bawah.

Lupa bahwa prefix-nya dibuang. Di dalam router yang dipasang di /api, req.path tidak menyertakan /api. Pakai req.originalUrl saat kamu butuh path lengkapnya.

Membandingkan parameter dengan angka. req.params.id === 1 selalu false karena req.params.id adalah string '1'.

Pertanyaan yang sering diajukan

Apa bedanya app.use dan app.get?

app.get('/users', fn) menjalankan fn hanya untuk request GET yang path-nya persis /users. app.use('/users', fn) berjalan untuk setiap method dan untuk path apa pun yang diawali /users, itulah sebabnya ia dipakai untuk memasang router dan middleware.

Bagaimana membuat route Express case sensitive?

Secara default route mengabaikan huruf besar kecil, jadi /Users cocok dengan /users. Matikan dengan app.set('case sensitive routing', true), atau per router dengan express.Router({ caseSensitive: true }).

Kenapa req.params kosong di dalam router bersarang?

Sebuah router hanya melihat parameter dari path miliknya sendiri. Kalau router itu dipasang di /users/:userId/posts, buat dengan express.Router({ mergeParams: true }) supaya req.params.userId dari path induknya tersedia.

Apakah semua route sebaiknya ditaruh di satu file?

Tidak, begitu jumlahnya lebih dari segelintir. Buat satu router per resource (routes/users.js, routes/orders.js), export dengan module.exports = router, lalu pasang masing-masing di file utama dengan app.use().

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai