Di Express, req.params berisi nilai segmen bernama di path route (/users/:id menghasilkan req.params.id), req.query berisi query string setelah ? (/search?q=node menghasilkan req.query.q), dan req.body berisi data yang dikirim di body request. req.params dan req.query terisi di setiap request, tetapi req.body tetap undefined sampai parser body seperti app.use(express.json()) membacanya. Nilai di params dan query selalu berupa string.
Request pertama menjawab {"params":{"userId":"7"},"query":{"sort":"new","limit":"2"}}. Perhatikan tanda kutipnya: 7 dan 2 adalah string, jadi ubah dengan Number() sebelum kamu menghitung atau membandingkan dengan angka. Sekarang ganti method-nya ke POST, biarkan path-nya /users/7/posts, dan kirim body {"title": "Hello", "draft": true}: jawabannya 201 dengan "body":{"title":"Hello","draft":true}, di mana true adalah boolean sungguhan karena berasal dari JSON.
req.params vs req.query vs req.body
req.params | req.query | req.body | |
|---|---|---|---|
| Berasal dari | Path, /users/:id | Query string, ?sort=new | Body request |
| Contoh URL atau body | /users/7 | /users?sort=new | {"name": "Ada"} |
| Nilai | { id: '7' } | { sort: 'new' } | { name: 'Ada' } |
| Tipe | String | String dan array berisi string | Apa pun isi JSON-nya |
| Perlu setup | :name di route | Tidak ada | app.use(express.json()) |
| Penggunaan umum | Resource yang mana | Filter, urutan, halaman | Data untuk dibuat atau diperbarui |
Sebuah route bisa punya beberapa parameter, dan setiap nama menjadi key di req.params: /teams/:teamId/members/:memberId memberikan kedua id. Tanda hubung atau titik juga memisahkannya, jadi /flights/:from-:to mengubah /flights/LAX-SFO menjadi { from: 'LAX', to: 'SFO' }.
req.query dengan key berulang dan yang tidak ada
Key yang muncul dua kali menjadi array, dan key yang tidak ada bernilai undefined, jadi beri opsinya nilai default:
Jawabannya {"page":1,"tags":["red","sale"],"raw":{"tag":["red","sale"]}}. Kirim GET /products?tag=red&page=3 dan tags tetap array, ["red"], karena [].concat() mengubah satu string atau array menjadi array. Express 5 mem-parse query string dengan parser sederhana milik Node, jadi ?filter[size]=m menghasilkan key "filter[size]", bukan object bersarang; Express 4 membuatnya bersarang.
req.body butuh express.json()
Node mengirim body sebagai stream byte. express.json() membacanya, mem-parse-nya, dan mengisi req.body, tetapi hanya saat request punya Content-Type: application/json. Form HTML mengirim application/x-www-form-urlencoded, yang butuh express.urlencoded().
Kirim POST /signup dengan body {"email": "ada@example.com"} dan kamu mendapat 201 dengan {"email":"ada@example.com","name":"anonymous"}. Kirim body kosong dan kamu mendapat 400. ?? {} itu penting: tanpanya, men-destructure undefined melempar TypeError di setiap request yang tidak punya body JSON. Untuk validasi bentuk dan tipe yang sungguhan, pakai library schema seperti zod.
req.headers dan req.get()
req.headers adalah object berisi semua header request, dengan nama huruf kecil. req.get(name) membaca satu header dan mengabaikan huruf besar kecil, jadi req.get('Content-Type') dan req.get('content-type') mengembalikan nilai yang sama. Beberapa property lain yang akan kamu pakai:
path bernilai /whoami dan originalUrl bernilai /whoami?debug=1. Tambahkan header Authorization: Bearer abc di request bar lalu kirim lagi: token menjadi "Bearer abc". Di dalam router yang dipasang dengan app.use('/api', router), req.path kehilangan prefix /api sedangkan req.originalUrl tetap menyimpannya (routing Express menjelaskan cara memasang router).
Kesalahan umum
Membaca req.body di request GET. Browser dan sebagian besar client tidak mengirim body bersama GET. Taruh opsi GET di query string.
Mengecek flag query sebagai truthy. ?admin=false menghasilkan string 'false', yang truthy, jadi if (req.query.admin) lolos. Bandingkan string-nya: req.query.admin === 'true'.
Mengirim JSON tanpa header. Client yang mengirim JSON sebagai text/plain mendapat req.body === undefined. Atur Content-Type: application/json di client.
Pertanyaan yang sering diajukan
Bagaimana cara mendapat alamat IP client di Express?
Baca req.ip. Di belakang proxy atau load balancer, nilainya adalah alamat proxy sampai kamu mengatur app.set('trust proxy', 1), yang membuat Express membaca header X-Forwarded-For.
Bagaimana cara mendapat URL lengkap sebuah request di Express?
req.originalUrl adalah path ditambah query string seperti yang dikirim client. Susun URL absolutnya dengan `${req.protocol}://${req.get('host')}${req.originalUrl}`.
Bagaimana menangani upload file di Express?
Upload file tiba sebagai multipart/form-data, yang tidak di-parse oleh express.json() maupun express.urlencoded(). Pakai package seperti multer, yang menaruh file-nya di req.file atau req.files dan field lainnya di req.body.
Bagaimana membaca cookie dari request?
Header mentahnya ada di req.get('cookie'). Untuk mendapat object di req.cookies, install package cookie-parser dan tambahkan app.use(cookieParser()).