WEB / WEB-16.03
Routing, middleware ve handler
Method/path router seçimini, middleware’in local continuation kararını ve handler’ın response sahibi olmasını ayrı izle.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Sıralı GET
- Public GET hazır
Client GET /notes?view=plain request’ini hazırlar; body yoktur ve server context’i henüz oluşmamıştır.
- Client / Duru
- GET hazır
- HTTP server
- Request yok
- Router / middleware
- Context yok
- Handler / result
- Sonuç yok
- Request ulaştı
HTTP request server’a ulaşır; GET method ve target local request context’ini oluşturmak için kullanılabilir.
- Client / Duru
- Response bekliyor
- HTTP server
- GET target alındı
- Router / middleware
- Context bekliyor
- Handler / result
- Sonuç yok
- Local request ref
Middleware local read-a correlation referansını oluşturur; next continuation network message değildir.
- Client / Duru
- Response bekliyor
- HTTP server
- Request context aktif
- Router / middleware
- request-ref tamamlandı
- Handler / result
- Sonuç yok
- Local route seçimi
Router pathname /notes’i query view=plain’den ayırır; GET için noteRead handler’ını seçer.
- Client / Duru
- Response bekliyor
- HTTP server
- Request context aktif
- Router / middleware
- Route seçildi: noteRead
- Handler / result
- Handler bekliyor
- Local presentation
Presentation middleware view state’ini hazırlar; handler’ın kullandığı preconditions artık tamamlanmıştır.
- Client / Duru
- Response bekliyor
- HTTP server
- Request context aktif
- Router / middleware
- Presentation hazır; sıralı trace
- Handler / result
- Handler hazır
- Local handler
noteRead, Routed note içeren 200 response’u hazırlar; bu read akışında storage write veya commit yoktur.
- Client / Duru
- Response bekliyor
- HTTP server
- 200 response hazırlandı
- Router / middleware
- Cycle tamamlandı
- Handler / result
- Routed note; 11 byte
- Local response end
Terminal owner bir kez end çağırır; response’un OS’a verilmesi client’ın body’yi aldığı anlamına gelmez.
- Client / Duru
- Response bekliyor
- HTTP server
- end once; finish OS handoff
- Router / middleware
- Cycle tamamlandı
- Handler / result
- Persistence operation yok
- Response ulaştı
200 response ve body client’a ulaşır; alınan content transport sonucudur, database commit kanıtı değildir.
- Client / Duru
- 200 Routed note alındı
- HTTP server
- Exchange tamamlandı
- Router / middleware
- Cycle tamamlandı
- Handler / result
- Commit iddiası yok
Method uyuşmazlığı
- Public girdi hazır
Client POST /notes request’ini hazırlar; örnek yalnız route/method kararını inceler ve application mutation içermez.
- Client / Duru
- Request hazır
- HTTP server
- Request yok
- Router / middleware
- Context yok
- Handler / result
- Sonuç yok
- Request ulaştı
HTTP request server’a ulaşır; target ve method bilgisi local route seçimi için kullanılabilir.
- Client / Duru
- Response bekliyor
- HTTP server
- POST /notes alındı
- Router / middleware
- Context bekliyor
- Handler / result
- Sonuç yok
- Local request ref
Middleware request correlation context’ini kurar; normal handler henüz çağrılmamıştır.
- Client / Duru
- Response bekliyor
- HTTP server
- Request context aktif
- Router / middleware
- request-ref tamamlandı
- Handler / result
- Handler çağrılmadı
- Local route seçimi
Örneğin route sözleşmesi 405 seçer: /notes için GET route vardır, fakat gelen method eşleşmez; normal handler çağrılmaz.
- Client / Duru
- Response bekliyor
- HTTP server
- 405 response seçildi
- Router / middleware
- GET route var; method eşleşmiyor
- Handler / result
- Handler çağrılmadı
- Local terminal
Fallback, status 405, Allow: GET ve Method not allowed body’sini taşıyan tek terminal response’u hazırlar. Handler ve presentation aşamalarına geçilmez; bu, örneğin manual method policy’sidir.
- Client / Duru
- Response bekliyor
- HTTP server
- 405 hazır; tek end
- Router / middleware
- Cycle tamamlandı
- Handler / result
- Handler çağrılmadı
- Response ulaştı
HTTP 405 response ve Method not allowed metni client’a ulaşır; bu status bir network error değildir.
- Client / Duru
- 405 Method not allowed alındı
- HTTP server
- Exchange tamamlandı
- Router / middleware
- Cycle tamamlandı
- Handler / result
- Handler çağrılmadı
Route yok
- Public girdi hazır
Client GET /absent request’ini hazırlar; örnek route yokluğu kararını inceler ve mutation içermez.
- Client / Duru
- Request hazır
- HTTP server
- Request yok
- Router / middleware
- Context yok
- Handler / result
- Sonuç yok
- Request ulaştı
HTTP request server’a ulaşır; target ve method bilgisi local route seçimi için kullanılabilir.
- Client / Duru
- Response bekliyor
- HTTP server
- GET /absent alındı
- Router / middleware
- Context bekliyor
- Handler / result
- Sonuç yok
- Local request ref
Middleware request correlation context’ini kurar; normal handler henüz çağrılmamıştır.
- Client / Duru
- Response bekliyor
- HTTP server
- Request context aktif
- Router / middleware
- request-ref tamamlandı
- Handler / result
- Handler çağrılmadı
- Local route seçimi
Örneğin route sözleşmesi 404 seçer; /absent için eşleşen route bulunmadığından normal handler çağrılmaz.
- Client / Duru
- Response bekliyor
- HTTP server
- 404 response seçildi
- Router / middleware
- Eşleşen route yok
- Handler / result
- Handler çağrılmadı
- Local terminal
Fallback 404 ve Route not found içeren tek terminal response hazırlar; ikinci completion engellenir.
- Client / Duru
- Response bekliyor
- HTTP server
- 404 hazır; tek end
- Router / middleware
- Cycle tamamlandı
- Handler / result
- Handler çağrılmadı
- Response ulaştı
HTTP 404 response ve Route not found metni client’a ulaşır; network transport hatası olarak yorumlanmaz.
- Client / Duru
- 404 Route not found alındı
- HTTP server
- Exchange tamamlandı
- Router / middleware
- Cycle tamamlandı
- Handler / result
- Handler çağrılmadı
Handler error
- Error read hazır
Client örneğin GET /notes/fail error route’unu seçer; request body yoktur ve henüz handler sonucu oluşmamıştır.
- Client / Duru
- GET fail hazır
- HTTP server
- Request yok
- Router / middleware
- Context yok
- Handler / result
- Sonuç yok
- Request ulaştı
HTTP GET server’a ulaşır; method ve target local pipeline’ın request context’i kurması için hazırdır.
- Client / Duru
- Response bekliyor
- HTTP server
- GET fail alındı
- Router / middleware
- Context bekliyor
- Handler / result
- Sonuç yok
- Local preconditions
Request-ref, route ve presentation stage’leri sırayla çalışır; /notes/fail için örnekteki error handler seçilir.
- Client / Duru
- Response bekliyor
- HTTP server
- Headers gönderilmedi
- Router / middleware
- Preconditions hazır
- Handler / result
- Error handler seçildi
- Local handler error
Handler headers gönderilmeye başlamadan örnekteki error’u üretir; response veya body henüz gönderilmemiştir.
- Client / Duru
- Response bekliyor
- HTTP server
- Headers gönderilmedi
- Router / middleware
- Error continuation
- Handler / result
- Headers öncesi örnek error
- Local error map
Error mapper kontrollü 500 ve Service unavailable response’unu hazırlar; body stack veya secret içermez.
- Client / Duru
- Response bekliyor
- HTTP server
- 500 response hazır
- Router / middleware
- Terminal owner: error-map
- Handler / result
- Persistence operation yok
- Local terminal
Tek terminal response için end çağrılır; bu akış headers gönderildikten sonraki stream recovery’yi modellemez.
- Client / Duru
- Response bekliyor
- HTTP server
- end once; finish OS handoff
- Router / middleware
- Cycle tamamlandı
- Handler / result
- Commit iddiası yok
- Response ulaştı
Kontrollü 500 response client’a ulaşır; HTTP status ile response completion ayrı sonuçlar olarak okunur.
- Client / Duru
- 500 Service unavailable alındı
- HTTP server
- Exchange tamamlandı
- Router / middleware
- Cycle tamamlandı
- Handler / result
- Commit iddiası yok
ROLLER · STATE · VERİ AKIŞI
Framework request execution’ını düzenler
Web framework runtime üzerinde request/response handling’i düzenleyen abstractions sağlar: router, middleware composition, handler/controller ve error path gibi. HTTP parsing veya JavaScript execution framework adından türemez. Express’in resmi guide’ı routing/middleware’i request-response cycle içindeki function call dizisi olarak anlatır. Bu dersin küçük manual Node pipeline’ı aynı görev ayrımını gösterir; Express’in bütün matching/error kurallarını uygulamaz.
Router hangi HTTP method ve route path için hangi handler’ın çalışacağını seçer. GET /notes?view=plain örneğinde pathname /notes ile query view=plain ayrı girdilerdir. Express route path query string içermez; başka framework’lerde matching, normalization ve sürüm kuralları değişebilir. URL path bir application object permission değildir; route eşleşmesi yalnız çalışacak code target’ını seçer.
Örneğin route table’ı yalnız GET /notes ve GET /notes/fail içerir. /notes’e farklı method geldiğinde bu manual sözleşme 405 ve Allow: GET döndürür; bütün framework’lerin otomatik aynı status’u seçtiği varsayılmaz. /absent için 404 sonucu çıkar. İki akış da handler’a geçmeden tamamlanır; bu kararlar route table’a ve method policy’sine bağlıdır.
Middleware state üretir veya cycle’ı kapatır
Middleware request context’ini okuyabilir veya değiştirebilir, response hazırlayabilir, error üretebilir ya da next continuation’a geçebilir. Express’te normal middleware cycle’ı bitirmiyorsa next() ile kontrolü ileri vermelidir; ikisini de yapmamak hanging request bırakabilir. Middleware’in mevcut olması bu request’te doğru sırada çalıştığını göstermez. Mount/path, method ve önceki component’in cycle’ı kapatması execution’ı etkiler.
Atlas pipeline önce requestRef üretir, sonra router method/path seçer, eşleşen route için presentation context’ini hazırlar ve handler’ı çağırır. Handler requestRef ile normalized view state’ini tüketir. Bu preconditions çalışma sırasıyla kurulur. Local next veya handler call HTTP packet değildir; aynı application process içindeki control flow’dur. Sahne client/server transfer ile local stage’leri bu yüzden ayırır.
Handler response ile cycle’ı kapattığında sonraki normal handler’a devam edilmez. Route yokluğu veya method mismatch fallback response’a gider. /notes/fail handler’ı headers başlamadan örnekteki error’u üretir; local error mapper kontrollü 500 ve Service unavailable metnini seçer. Bu, bütün Node/Express async exception’larının otomatik yakalandığı anlamına gelmez. Error contract, framework sürümü ve Promise/stream lifecycle ayrıca belirlenir.
Response’ın tek sahibi ve completion sınırları
Handler/controller input’u uygulama mantığına bağlar, domain sonucu ve representation’ı HTTP response’a dönüştürür. Controller adı database write veya transaction garantisi vermez. Public note handler yalnız Routed note okur; persistence operation yoktur. Stateful action’da commit, response preparation ve client observation aynı event değildir; storage sözleşmesi ayrı uygulanır.
Node response headersSent headers’in gönderildiğini, writableEnded end() çağrıldığını, writableFinished ise underlying system’e flush completion’ı anlatır. ServerResponse finish son response segment’inin transmission için OS’a verilmesidir; client received/read veya business commit kanıtı değildir. Örnekte final status ile client body ayrı okunur. Routed note 11 UTF-8 byte’dır; string character sayısı genel byte hesabı değildir.
Application terminal decision’ı tek bir bileşen sahiplenmelidir. Headers başladıktan sonra farklı status/body ile ikinci normal response üretmek geçerli lifecycle değildir; stream/error sonucuna göre connection handling farklı olabilir. Örneğin terminal guard’ı ikinci logical completion denemesini gönderimden önce durdurur. Header sonrası network abort veya persistence failure için pre-header error mapper’ın aynı çözüm olduğu söylenemez.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Method mismatch
- Method ve pathname seçildi
MethodMismatch POST /notes için hazırlanmıştır. Path’in routeTable’da görünmesi method gate’inin de geçtiği anlamına gelmez.
- Request/completion context
- POST /notes
- Selection/runtime boundary
- Route selection yok
- Handler/business outcome
- Handler çağrılmadı
- Route table method’u okundu
RouteTable /notes için GET ve noteRead eşleştirir. Bu finite public route contract POST’u handler’a yönlendirmez.
- Request/completion context
- POST /notes
- Selection/runtime boundary
- Expected method=GET
- Handler/business outcome
- Handler çağrılmadı
- Method gate’i handler’dan önce durdu
handlerInvoked=false ve status=405 verilir. Allow=GET bu seçili route’un desteklediği method’u belirtir; object permission değildir.
- Request/completion context
- Method mismatch
- Selection/runtime boundary
- 405; Allow=GET
- Handler/business outcome
- Handler invoked=false
- Presentation query permission sayılmadı
Normal GET target’ında view=plain query’si pathname’den ayrıdır. Bu harmless presentation seçimi method veya authentication gate’ini değiştirmez.
- Request/completion context
- Method mismatch
- Selection/runtime boundary
- Query ≠ method/permission
- Handler/business outcome
- Handler invoked=false
- Response owner’ı açık kaldı
Method not allowed body’si route selection boundary’sine aittir. RouteAbsent 404 ile methodMismatch 405 farklı nedenler taşır; ikisinde de handler çağrılmamıştır.
- Request/completion context
- Method not allowed
- Selection/runtime boundary
- Selection-level response
- Handler/business outcome
- No handler grant inferred
- Routing hükmü authorization’a büyümedi
Bu case yalnız method/path dispatch sonucunu açıklamaktadır. Bir middleware’in listede bulunması bütün protected route’larda handler öncesi access kontrolü yaptığı kanıtı değildir.
- Request/completion context
- Known: method mismatch
- Selection/runtime boundary
- Known: no handler dispatch
- Handler/business outcome
- Authorization requires separate evidence
Finish sınırı
- Response completion metadata seçildi
Completion endCalls=1 ve secondLogicalCompletionBlocked=true taşır. Terminal response state’i business commit veya client receipt ile aynı field değildir.
- Request/completion context
- Completion record
- Selection/runtime boundary
- Transport state okunmadı
- Handler/business outcome
- Business/receipt bilinmiyor
- Sent ve ended state okundu
headersSentAfterTerminal ve writableEndedAfterTerminal true’dur. Bu local API state’leri ikinci logical completion guard’ından ayrı okunur.
- Request/completion context
- Terminal response
- Selection/runtime boundary
- Headers sent; writable ended
- Handler/business outcome
- Business/receipt bilinmiyor
- Finish boundary doğru yorumlandı
finishMeansOSHandOff=true, finishProvesClientReceived=false’tur. Server’ın OS’ye teslimi remote browser’ın bütün body’yi okuduğunu göstermez.
- Request/completion context
- Terminal response
- Selection/runtime boundary
- OS handoff only
- Handler/business outcome
- Client receipt not proven
- Persistence evidence yokluğu korundu
persistenceOperation=null ve commitProven=false’tur. Read response hazırlanması storage mutation veya committed transaction sonucu üretmez.
- Request/completion context
- Read completion
- Selection/runtime boundary
- No persistence operation
- Handler/business outcome
- Commit not proven
- Unsupported success claim durduruldu
Finish observation’a committed=true eklemek business state’i uydurur. Client success göstergesi ve storage success kendi source result’larını ister.
- Request/completion context
- Known: terminal response state
- Selection/runtime boundary
- Transport/persistence separate
- Handler/business outcome
- No inferred commit/receipt
- Terminal guard’ın scope’u korundu
İkinci logical completion bloke edilmiştir; gerçek malformed response üretilmez. Bu local guard tek başına network delivery veya tüm error handling garantisi değildir.
- Request/completion context
- One logical completion
- Selection/runtime boundary
- Second completion blocked
- Handler/business outcome
- UNKNOWN: client receipt
VARSAYIM · SINIR · KONTROL
Route eşleşmesi permission değildir
Method/path eşleşmesi request’in hangi code’a ulaşacağını seçer; user, tenant veya object authorization’ını kendiliğinden doğrulamaz. Middleware’in mevcut olması da kontrolün o route’ta handler’dan önce çalıştığının kanıtı değildir. Yanlış varsayım routing/presentation context’ini authoritative access decision saymaktır. Personalized operation’daki etki uygulamanın kontrol zincirine bağlıdır; bu dersin public read handler’ı identity kabul etmez.
Yanlış ordering handler’ın henüz üretilmemiş context’i kullanmasına veya early terminal response’un sonraki observation stage’ini atlamasına yol açabilir. Kontrol, dependency’leri ve hangi stage’in next veya terminal seçtiğini açık tutmaktır. Public note için beklenen trace request-ref→route→presentation→handler’dir. Normal trace uyuşmazlığı debugging kanıtıdır; otomatik policy bypass veya compromise hükmü değildir.
Completion’a taşıdığından fazla anlam yükleme
Server finish event’ini client successful action veya committed transaction diye yorumlamak gözlem sınırını aşar. Normal read için body arrival client tarafında doğrulanabilir; persistence için ayrıca storage result gerekir. Sorun transport/local lifecycle ile business state’i tek success alanına indirmektir. Etki operation’a bağlı stale UI, yanlış confirmation veya error handling karışıklığı olabilir.
Pre-header handler error’unu kontrollü 500’a çevirmek bir failure sınırıdır. Headers başladıktan sonra aynı çözümü denemek duplicate response veya truncated transfer sorunlarına gidebilir. Terminal owner, sent/ended/finished state ve exception phase birlikte tutulur; ikinci completion gönderimden önce durdurulur. Bu kontrolün varlığıyla 500 gözlemi de ayrı değerlendirilir: status tek başına data leak veya saldırı kanıtı değildir.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Pre-header error
- Handler error evidence seçildi
GET /notes/fail için handlerError kaydı incelenir. Hatanın beforeHeaders=true olması error response üretiminin belirleyici koşuludur.
- Route/error observation
- GET /notes/fail
- Stage/owner review
- Stage trace okunmadı
- Outcome evidence scope
- Final outcome bilinmiyor
- Expected stage trace karşılaştırıldı
Trace request-ref, route, presentation, handler ve error-map sırasını taşır. Error-map handler’dan sonraki terminal owner’dır; aynı handler success sonucu değildir.
- Route/error observation
- GET /notes/fail
- Stage/owner review
- Handler → error-map
- Outcome evidence scope
- Final outcome bilinmiyor
- Pre-header error mapping okundu
status=500 ve body=Service unavailable olarak verilmiştir. Bu controlled mapping, headers başladıktan sonraki streaming error’larına otomatik uygulanmış sayılmaz.
- Route/error observation
- Known: beforeHeaders=true
- Stage/owner review
- Terminal owner=error-map
- Outcome evidence scope
- 500 Service unavailable
- Error status attack evidence sayılmadı
500 bir server-side failure sonucu olabilir; bu kayıttan data leak veya kötü niyetli actor teşhisi çıkarılmaz. İç cause ile dış response farklı observation alanlarıdır.
- Route/error observation
- Known: controlled error mapping
- Stage/owner review
- Internal cause not established
- Outcome evidence scope
- No actor attribution
- Client delivery kanıtı ayrı bırakıldı
Terminal status/body server sonucudur. Server finish, client receipt ve DOM feedback için ayrıca gözlem gerekir; burada bu eksik alanlar tamamlanmaz.
- Route/error observation
- Declared 500 response
- Stage/owner review
- Before-header scope retained
- Outcome evidence scope
- UNKNOWN: actual client receipt
- Error boundary hükmü kapandı
Bu row handler error’unun error-map’e before-headers koşuluyla geçtiğini gösterir. Post-header termination veya transaction rollback sonucu bu fixture’ın dışındadır.
- Route/error observation
- Known: handler/error-map order
- Stage/owner review
- Known: controlled response
- Outcome evidence scope
- Other error phases unknown
Trace eksik
- Normal trace inceleme kapsamı daraltıldı
Bu branch normal trace’in request-ref ve route prefix’ini inceler. Presentation ve handler observation’ları verilmediğinde source yokluğu ayrı işaretlenir.
- Route/error observation
- Normal trace prefix
- Stage/owner review
- Later-stage evidence missing
- Outcome evidence scope
- Handler sonucu bilinmiyor
- Route selection kanıtı okundu
GET /notes?view=plain için pathname=/notes seçilmiştir. Handler adı noteRead olması, handler’ın bu kısmi observation’da çalıştığını göstermez.
- Route/error observation
- GET pathname=/notes
- Stage/owner review
- Selected handler=noteRead
- Outcome evidence scope
- Handler execution unknown
- Dependency state eksikliği korundu
Presentation hazır olduktan sonra handler’a geçilmesi beklenir. Missing presentation kaydı, stage atlandı veya tamamlandı diye iki yönde de kesin yorumlanmaz.
- Route/error observation
- Selected normal route
- Stage/owner review
- Presentation evidence missing
- Outcome evidence scope
- UNKNOWN: stage progression
- Missing log bypass sayılmadı
Middleware listesi veya eksik event, protected route permission kontrolünün sonucu değildir. Public read fixture authentication kabul etmez; grant icat edilmez.
- Route/error observation
- Selected normal route
- Stage/owner review
- Incomplete stage trace
- Outcome evidence scope
- No authorization inference
- Tam source trace istendi
Aynı requestRef ve terminal owner scope’undaki presentation, handler ve completion observation’ları gerekir. Raw credential veya tüm response body eklemek stage boşluğunu çözmez.
- Route/error observation
- Request correlation scope
- Stage/owner review
- Complete trace evidence required
- Outcome evidence scope
- UNKNOWN: execution outcome
- Kısmi trace hükmü kapsamlı kaldı
Route seçimi bilinir; handler execution ve terminal outcome bu kısmi kapsamda UNKNOWN’dur. Expected trace, gözlenmiş trace yerine kullanılamaz.
- Route/error observation
- Known: selected route
- Stage/owner review
- UNKNOWN: later stages
- Outcome evidence scope
- UNKNOWN: terminal outcome
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Route selection ile stage trace’ini ilişkilendir
RequestRef ile method, parsed pathname, query view ve seçilen handler’ı ilişkilendir. GET /notes?view=plain için pathname /notes, handler noteRead ve beklenen stage trace kaydedilir. Method mismatch akışında handlerInvoked=false ile 405 ve Allow: GET; route yokluğunda handlerInvoked=false ile 404 ayrı sonuçlardır. Gerçek telemetry field mapping server/framework’e bağlıdır; artifact bir runtime access-log formatı değildir.
Middleware pass, terminal ve error kararlarını aynı request context’inde incele. Request-ref ve presentation hazır olmadan handler’a girilmemesi beklenir. Log eksikse stage çalışmadı diye hüküm verme; source field’in absent olduğunu belirt. Router’ın doğru route’u seçmesi authorization kontrolünün yapıldığını göstermez. Personalized handler envanterinde gereken access decision ayrıca izlenir.
Final response ile business sonucunu ayır
Handler’ın terminal owner’ını, final status’unu ve body byte sayısını aynı exchange’e bağla. Normal Routed note response’u status=200 ve 11 byte body içerir. Fail route 500/Service unavailable, method mismatch 405/Method not allowed, missing route ise 404/Route not found verir. Error akışının beforeHeaders koşulunu koru; header sonrası stream sonucunu bu örnekten çıkarma.
Server writableEnded ve finish gözlemini client’ın body’yi almasından ayrı kaydet. Guard’ın ikinci logical completion’ı durdurduğu ve tek response end çağrısı olduğu local decision metadata’sından okunur. Bu read örneğinde persistence operation yoktur. Stateful service’te storage’ın commit/error sonucu ayrıca gözleneceği için transport finish’e committed=true eklenmez.
Artifact XPath’i persistenceObserved=false iken commitClaim=true yazılan response kayıtlarını sayar. Normal read sonucunda 0, desteklenmeyen commit yorumunda 1 eşleşme verir. Correlation yalnız response elementi içindedir; database audit veya distributed transaction query değildir. Element eksikken sonuç 0 olsa da commit’in doğru veya yanlış olduğu söylenemez.
Pass ve terminal kararını tek akışta uygula
Route ve middleware sırası yalnız log düzeni değildir: sonraki handler’a geçişi belirler. Gerekli request context hazır olmadan kişiselleştirilmiş handler’ı çalıştırma; access kararı gerekiyorsa bunu handler’dan önce ayrıca tamamla. Middleware ya akışı bitirir ya da açıkça sonraki aşamaya geçirir. Ret veya error sonucu üretildikten sonra normal handler’a devam edilmemeli; ortak response owner ikinci bir tamamlamayı kabul etmemelidir. Express kullanılıyorsa next ve error-handling middleware sözleşmesi izlenir; bu örneğin sade dispatcher’ı Express çalıştırıldığı anlamına gelmez.
Normal route’ta beklenen stage sırasını ve tek terminal sonucu doğrula. Method uyuşmazlığında 405 ile Allow: GET, bulunamayan route’ta 404 ve beforeHeaders error dalında 500 korunurken handler’ın çağrılmadığını ya da normal sonuç vermediğini kontrol et. Bu status’lar örneğin açık dispatch politikasıdır; her framework’ün kendiliğinden aynı kararı verdiği varsayılmaz. Stage kaydı eksikse sonuç bilinmiyordur; yalnız son status üzerinden middleware’in veya authorization kontrolünün çalıştığını kanıtlama.
ŞİMDİ VAKAYA UYGULA
Route match ve finish hangi business sonucunu kanıtlamaz?
Public read route’u method/path ile seçilir; middleware context, terminal owner ve client knowledge kendi boundaries’ında kalır.
Vakadaki input, server işleme ve response için karar sırasını çıkar. Parsed veya valid data ile completed operation aynı sonuç değildir; hangi owner’ın hangi koşulu değerlendirdiğini belirt.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Route selection ve terminal response defteri
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"routeTable": [
{
"method": "GET",
"pathname": "/notes",
"handler": "noteRead"
},
{
"method": "GET",
"pathname": "/notes/fail",
"handler": "fixtureReadFailure"
}
],
"normal": {
"method": "GET",
"target": "/notes?view=plain",
"pathname": "/notes",
"query": {
"view": "plain"
},
"requestRef": "read-a",
"trace": [
"request-ref",
"route",
"presentation",
"handler"
],
"handlerInvoked": true,
"status": 200,
"body": "Routed note",
"contentOctets": 11,
"terminalOwner": "noteRead"
},
"methodMismatch": {
"method": "POST",
"pathname": "/notes",
"bodyOctets": 0,
"status": 405,
"allow": "GET",
"body": "Method not allowed",
"handlerInvoked": false
},
"routeAbsent": {
"method": "GET",
"pathname": "/absent",
"status": 404,
"body": "Route not found",
"handlerInvoked": false
},
"handlerError": {
"method": "GET",
"pathname": "/notes/fail",
"trace": [
"request-ref",
"route",
"presentation",
"handler",
"error-map"
],
"beforeHeaders": true,
"status": 500,
"body": "Service unavailable",
"terminalOwner": "error-map"
},
"completion": {
"endCalls": 1,
"secondLogicalCompletionBlocked": true,
"headersSentAfterTerminal": true,
"writableEndedAfterTerminal": true,
"finishMeansOSHandOff": true,
"finishProvesClientReceived": false,
"persistenceOperation": null,
"commitProven": false
},
"selector": {
"language": "XPath",
"xml": "<observations><response finish=\"true\" persistenceObserved=\"false\" commitClaim=\"false\"/></observations>",
"xpath": "count(/observations/response[@persistenceObserved=\"false\" and @commitClaim=\"true\"])",
"expected": 0,
"positiveFixtureXml": "<observations><response finish=\"true\" persistenceObserved=\"false\" commitClaim=\"true\"/></observations>",
"positiveExpected": 1,
"scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
"missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
}
}- routeTable / normal
- Method/path selection query’den ayrıdır; local stage sırası ayrıca tanımlanır.
- methodMismatch / routeAbsent
- Handler’a ulaşmadan tamamlanan farklı fallback kararları.
- handlerError / completion
- Headers başlamadan verilen kontrollü error ile transport/business completion ayrımı.
Public-read pipeline’ını anlatan inert örnektir. Exact matching, 405 ve error policy manual Node sözleşmesine aittir; Express execution veya database transaction kanıtı değildir.
İki yanlış kanı
Route eşleşti ve middleware var ise permission doğrulanmıştır.
Selection code target’ını belirler; gerekli access decision’ın doğru route ve sırada uygulanması ayrı sözleşmedir.
ServerResponse finish client success ve database commit’i kanıtlar.
Finish OS’a transmission handoff’tur; client body ve persistence result ayrı observation ister.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
POST /notes için pathname biliniyor, fakat route table yalnız GET tanımlıyor. Handler çağrılır mı?
- Evet. Pathname eşleşmesi bütün method’ları açar.
- Hayır. 405 ve Allow: GET döner.
Gerekçeli cevabı oku
Hayır. 405 ve Allow: GET döner. — Path bulunuyor, fakat method eşleşmiyor; handlerInvoked=false. Hiç bulunmayan route için 404 ayrı bir branch’tir.
Response finish olayı, client’ın response aldığını kanıtlar mı?
Dersten seçilen artifact alanları; öğretim örneği
- completion.endCalls
- 1
- completion.finishMeansOSHandOff
- true
- completion.finishProvesClientReceived
- false
- Hayır. finish burada OS handoff sınırını gösterir.
- Evet. finish, client’ın body’yi parse ettiğini bildiren ACK’tir.
Gerekçeli cevabı oku
Hayır. finish burada OS handoff sınırını gösterir. — finishProvesClientReceived=false. Server’daki yerel tamamlanma, client’tan teslim onayı değildir.
Headers yazılmadan oluşan handler hatası 500’e dönüştürülüyor. İkinci response neden engellenmeli? Business commit hakkında ne bilinmiyor?
Gerekçeli cevabı oku
Hata headers’tan önce oluştuğu için error-map response’u oluşturabilir. endCalls=1 ve secondLogicalCompletionBlocked, ikinci terminal sonucu engeller. persistenceOperation=null olduğu için finish, 500 veya 200 business commit kanıtı değildir. Bu sıralı örnek, bütün framework’lerin error handling davranışını doğrulamaz.
□ Tek terminal response kararını açıkladım.
□ Response’un bitmesini business commit saymadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- Express — Routing guideRouting · Route methods · Route paths · Route handlers
- Express — Using middlewareUsing middleware · Middleware sub-stacks · Multiple route handlers · Error-handling middleware
- Node.js v24.13.0 — HTTP APIHTTP · http.createServer([options][, requestListener]) · Class: http.ServerResponse · http.ServerResponse Event: finish · response.writableEnded · response.writableFinished · response.headersSent · response.strictContentLength
- Node.js Learn — Anatomy of an HTTP TransactionCreate the Server · Method, URL and Headers · HTTP Status Code · Sending Response Body