Menu

req.params, req.query dan req.body di Express

req.params berisi bagian path yang diberi nama (/users/:id), req.query berisi query string (?sort=new), dan req.body berisi body request yang sudah di-parse, yang bernilai undefined sampai kamu menambahkan parser body seperti express.json().

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

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.paramsreq.queryreq.body
Berasal dariPath, /users/:idQuery string, ?sort=newBody request
Contoh URL atau body/users/7/users?sort=new{"name": "Ada"}
Nilai{ id: '7' }{ sort: 'new' }{ name: 'Ada' }
TipeStringString dan array berisi stringApa pun isi JSON-nya
Perlu setup:name di routeTidak adaapp.use(express.json())
Penggunaan umumResource yang manaFilter, urutan, halamanData 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()).

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai