Treci la conținutul principal

Cod în jurul fiecărui handler

Middleware este cod care rulează în jurul handlerelor tale: înainte ca cererea să ajungă la ele, după ce răspunsul pleacă de la ele sau în locul lor. Jurnalizare, autentificare, limitarea ratei, compresie — toate sunt middleware.

Aceeași idee circulă sub trei nume: framework-urile web spun middleware, gRPC spune interceptor, unele ecosisteme spun filtru. Un singur concept, trei vocabulare.

În TypeScript, un middleware este o funcție care primește un handler și returnează un handler împachetat — exact șablonul Decorator din grupul de șabloane de proiectare, iar o stivă de astfel de funcții se comportă ca un Chain of Responsibility.


Un middleware de jurnalizare

withLogging împachetează orice handler: afișează cererea care intră, lasă handlerul să lucreze și afișează din nou la ieșire. Handlerul însuși rămâne complet neștiutor.

Jurnalizarea reală adaugă de obicei o marcă de timp și o durată. Aceste exemple le lasă pe amândouă deoparte intenționat, ca rezultatul afișat să fie același la fiecare rulare.

Împachetezi o dată, jurnalizezi tot

Un singur împachetator în jurul întregului router și ambele căi sunt jurnalizate — jurnalizarea este scrisă o singură dată, în împachetator, nu în fiecare handler.

Prompt
Scrie un program TypeScript cu un middleware withLogging care primește un handler și returnează un handler împachetat, afișând o linie cu săgeată ce conține metoda și calea înainte de a apela handlerul următor și o linie de finalizare după. Împachetează un router mic cu două rute, servește-l pe portul 0, cere ambele căi cu fetch și afișează răspunsurile.
Ieșire: program TypeScript și rezultatul capturat
Wrap once, log everything

Middleware care oprește cererea

Un middleware poate și să refuze: o verificare de autentificare care nu găsește o cheie validă scrie 401 Unauthorized și nu apelează niciodată handlerul următor.

Înlănțuit ca withLogging(withAuth(handler)), cererea trece prin straturi în ordine — iar răspunsul iese înapoi prin ele.

Un strat de autentificare în lanț

Cererea fără antetul X-API-Key este oprită de stratul de autentificare cu 401 — handlerul nu rulează niciodată. Cu cheia, cererea trece prin tot lanțul și ajunge la date.

Prompt
Scrie un program TypeScript cu două middleware-uri înlănțuite: withLogging care afișează cererea și withAuth care verifică antetul X-API-Key și răspunde cu 401 fără a apela handlerul următor atunci când cheia lipsește sau este greșită. Împachetează un handler de date ca withLogging(withAuth(handler)), servește-l pe portul 0, apoi trimite o cerere fără cheie și una cu ea, afișând ambele stări și corpuri.
Ieșire: program TypeScript și rezultatul capturat