Menu

Node.js HTTP Sunucu Oluşturma: http.createServer

http.createServer(), her istek için req ve res ile çalışan tek bir fonksiyon alır. Method'u ve URL'yi req'ten okursun, sonra res üzerinde status, header'lar ve body ayarlayıp res.end() çağırırsın.

Bu sayfada çalıştırılabilir editörler var. Düzenle, çalıştır ve sonucu anında gör.

http.createServer(), tek bir fonksiyondan, request handler'dan bir web sunucusu oluşturur. Node bu fonksiyonu gelen her istek için iki nesneyle çağırır: req (istemcinin gönderdiği method, URL ve header'lar) ve res (senin geri gönderdiğin). res üzerinde bir status code ve header'lar ayarla, sonra body ile res.end() çağır. server.listen(3000) 3000 portunda bağlantı kabul etmeye başlar.

İlk istek You asked for GET /hello?name=Ada cevabını alır, Console da aynı method ve URL'yi yazdırır. İstek çubuğundan DELETE /anything gönder: aynı handler ona da cevap verir, çünkü düz bir http sunucusunun route'ları yoktur. Her istek o tek fonksiyondan geçer.

JSON göndermek ve status code ayarlamak

res.writeHead(status, headers) status code'u ve header'ları tek çağrıda ayarlar. JSON için Content-Type: application/json ayarla ve JSON.stringify()'ın sonucunu gönder; res.end() yalnızca bir string ya da Buffer kabul eder.

GET /users?limit=1 isteği [{"id":1,"name":"Ada"}] döndürür. req.url, path ile query string'in birleşimidir; new URL(req.url, 'http://localhost') onu pathname ve searchParams olarak ayırır (base sadece URL mutlak bir adres istediği için orada). GET /nothing gönder, status 404 olur.

İstekleri switch ile yönlendirmek

Küçük bir API için method ve path üzerinde bir switch'ten fazlası gerekmez. 'GET /users' gibi bir anahtar oluştur ve her route'a kendi case'ini ver:

{"name": "Grace"} body'siyle POST /users gönder: cevap {"id":2,"name":"Grace"} ile 201'dir ve GET /users artık iki kullanıcıyı da listeler. Aynı POST'u hello body'siyle gönderirsen {"error":"Body must be JSON"} ile 400 alırsın.

POST body okumak

Node body'yi senin için ayrıştırmaz. req okunabilir bir stream'dir; body data event'leriyle parça parça gelir, tamamlandığında da end tetiklenir. Yukarıdaki readBody() parçaları bir string'de toplar ve bir promise döndürür, böylece handler onu await edebilir. req async iterable olduğu için bu döngü de aynı işi görür:

let data = '';
for await (const chunk of req) data += chunk;
const body = JSON.parse(data);

Gerçek bir sunucu boyutu da sınırlar (data.length bir sınırı geçince okumayı bırakıp 413 ile cevap verir) ve JSON.parse çağırmadan önce req.headers['content-type']'ı kontrol eder.

Sık yapılan hatalar

res.end()'i unutmak. Status ayarlayıp response'u hiç bitirmeyen bir dal, istemciyi zaman aşımına kadar bekletir.

Body'den sonra header ayarlamak. res.end() ya da ilk res.write() çalıştıktan sonra header'lar gönderilmiştir ve res.setHeader() ERR_HTTP_HEADERS_SENT fırlatır. Örneklerdeki gibi, erken response gönderdiğinde return kullan.

req.url'yi bir path ile karşılaştırmak. req.url query string'i de içerir, bu yüzden /users?limit=1 için req.url === '/users' false'tur. pathname'i karşılaştır.

Ne zaman Express kullanmalı

http modülü bir health check, bir webhook alıcısı ya da HTTP'nin nasıl çalıştığını öğrenmek için yeterlidir. /users/:id gibi route parametrelerine, JSON body ayrıştırmaya, middleware'e ve hata yönetimine ihtiyaç duyduğunda kendi küçük framework'ünü yazmaya başlarsın. Express, aynı req ve res nesneleri üzerine kurulu o framework'tür; Express routing aynı API'yi app.get() ve app.post() ile gösteriyor.

Sıkça Sorulan Sorular

res.write ile res.end arasındaki fark nedir?

res.write() body'nin bir parçasını gönderir ve response'u açık tutar, yani onu birçok kez çağırabilirsin. res.end() isteğe bağlı son bir parçayı gönderir ve response'u bitirir. Her response'un tam olarak bir res.end()'e ihtiyacı vardır.

Bir Node HTTP sunucusunu nasıl durdururum?

server.close() çağır. Yeni bağlantıları kabul etmeyi hemen bırakır ve açık olanlar bittiğinde callback'ini çalıştırır; SIGTERM geldiğinde temiz bir kapanış için gereken de budur.

http modülüyle HTTPS nasıl kullanılır?

Bunun yerine https modülünü kullan: https.createServer({ key, cert }, handler) aynı handler'ı, ayrıca bir private key ve bir sertifika alır. Production'da TLS'i genellikle Nginx gibi bir proxy ya da hosting platformu sonlandırır, Node sunucun da düz HTTP dinlemeye devam eder.

Bir Node sunucusu hangi portu dinlemeli?

1024'ün üstündeki herhangi boş bir port admin yetkisi olmadan çalışır; geliştirmede 3000 ve 8080 yaygındır. Hosting platformları portu genellikle bir ortam değişkeninde verir, bu yüzden server.listen(process.env.PORT || 3000) yaz.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

Başla