Express'te req.params route path'indeki isimli parçaların değerlerini tutar (/users/:id sana req.params.id verir), req.query ? sonrasındaki query string'i tutar (/search?q=node sana req.query.q verir), req.body ise istek body'sinde gönderilen veriyi tutar. req.params ve req.query her istekte doldurulur, ama req.body, app.use(express.json()) gibi bir body parser onu okuyana kadar undefined kalır. Params ve query içindeki değerler her zaman string'dir.
İlk istek {"params":{"userId":"7"},"query":{"sort":"new","limit":"2"}} ile cevap verir. Tırnaklara dikkat et: 7 ve 2 string'dir, bu yüzden matematik yapmadan ya da sayılarla karşılaştırmadan önce onları Number() ile dönüştür. Şimdi metodu POST yap, /users/7/posts path'ini koru ve {"title": "Hello", "draft": true} body'sini gönder: cevap "body":{"title":"Hello","draft":true} içeren bir 201 olur; burada true JSON'dan geldiği için gerçek bir boolean'dır.
req.params, req.query ve req.body karşılaştırması
req.params | req.query | req.body | |
|---|---|---|---|
| Nereden gelir | Path, /users/:id | Query string, ?sort=new | İstek body'si |
| Örnek URL ya da body | /users/7 | /users?sort=new | {"name": "Ada"} |
| Değer | { id: '7' } | { sort: 'new' } | { name: 'Ada' } |
| Tipler | String'ler | String'ler ve string dizileri | JSON ne tutuyorsa |
| Gereken kurulum | Route'ta bir :name | Hiçbir şey | app.use(express.json()) |
| Tipik kullanım | Hangi kaynak | Filtreleme, sıralama, sayfa | Oluşturulacak ya da güncellenecek veri |
Bir route'un birkaç parametresi olabilir ve her isim req.params içinde bir key olur: /teams/:teamId/members/:memberId iki id'yi de verir. Kısa çizgi ya da nokta da onları ayırır, yani /flights/:from-:to, /flights/LAX-SFO adresini { from: 'LAX', to: 'SFO' } değerine çevirir.
Tekrarlanan ve eksik key'lerle req.query
İki kez geçen bir key diziye dönüşür, eksik bir key ise undefined olur, bu yüzden seçeneklere varsayılan bir değer ver:
Cevap {"page":1,"tags":["red","sale"],"raw":{"tag":["red","sale"]}} olur. GET /products?tag=red&page=3 gönderirsen tags yine bir dizidir, ["red"], çünkü [].concat() tek bir string'i ya da bir diziyi diziye çevirir. Express 5 query string'leri Node'un basit parser'ı ile parse eder, bu yüzden ?filter[size]=m iç içe bir nesne değil, "filter[size]" key'ini verir; Express 4 bunu iç içe nesneye çeviriyordu.
req.body için express.json() gerekir
Node body'yi bir byte stream'i olarak verir. express.json() onu okur, parse eder ve req.body değerini ayarlar, ama yalnızca istekte Content-Type: application/json varsa. HTML formları application/x-www-form-urlencoded gönderir, bunun için de express.urlencoded() gerekir.
{"email": "ada@example.com"} body'siyle POST /signup gönder, {"email":"ada@example.com","name":"anonymous"} ile 201 alırsın. Boş bir body gönderirsen 400 alırsın. ?? {} önemlidir: o olmadan JSON body'si olmayan her istekte undefined değerini destructure etmek bir TypeError fırlatır. Yapının ve tiplerin gerçek doğrulaması için zod gibi bir şema kütüphanesi kullan.
req.headers ve req.get()
req.headers, küçük harfli isimlerle her istek header'ını içeren bir nesnedir. req.get(name) tek bir header'ı okur ve büyük küçük harfe bakmaz, yani req.get('Content-Type') ile req.get('content-type') aynı değeri döndürür. Kullanacağın birkaç property daha:
path değeri /whoami, originalUrl değeri ise /whoami?debug=1 olur. İstek çubuğuna Authorization: Bearer abc header'ını ekle ve tekrar gönder: token, "Bearer abc" olur. app.use('/api', router) ile bağlanmış bir router içinde req.path /api önekini kaybeder, req.originalUrl ise korur (bağlamayı Express routing anlatıyor).
Sık yapılan hatalar
Bir GET isteğinde req.body okumak. Tarayıcılar ve çoğu istemci GET ile body göndermez. GET seçeneklerini query string'e koy.
Bir query bayrağını truthy olup olmadığına göre test etmek. ?admin=false truthy olan 'false' string'ini verir, bu yüzden if (req.query.admin) geçer. String'leri karşılaştır: req.query.admin === 'true'.
JSON'u header olmadan göndermek. JSON'u text/plain olarak gönderen bir istemci req.body === undefined alır. İstemcide Content-Type: application/json ayarla.
Sıkça Sorulan Sorular
Express'te istemcinin IP adresini nasıl alırım?
req.ip değerini oku. Bir proxy ya da load balancer arkasında, app.set('trust proxy', 1) ayarlayana kadar bu proxy'nin adresidir; bu ayar Express'in onun yerine X-Forwarded-For header'ını okumasını sağlar.
Express'te bir isteğin tam URL'sini nasıl alırım?
req.originalUrl, istemcinin gönderdiği haliyle path artı query string'dir. Mutlak URL'yi `${req.protocol}://${req.get('host')}${req.originalUrl}` ile oluştur.
Express'te dosya yüklemeyi nasıl yönetirim?
Dosya yüklemeleri multipart/form-data olarak gelir ve express.json() ile express.urlencoded() bunu parse etmez. Dosyaları req.file ya da req.files içine, diğer alanları req.body içine koyan multer gibi bir paket kullan.
İstekten bir cookie'yi nasıl okurum?
Ham header req.get('cookie') içindedir. req.cookies içinde bir nesne almak için cookie-parser paketini kur ve app.use(cookieParser()) ekle.