Vezérlőpult
6. Middleware · Express alapok

Express alapok · 6. tananyag

Middleware

Már használtuk, csak nem neveztük néven: az express.json() is middleware. Most jön a rendszer mögé. A middleware az Express szíve — és egyetlen szabályból fakad szinte minden buktatója: a sorrend számít.

3 tanóraA láncmorgan · cors · helmet

A fejezet végén tudni fogod

1Mi a middleware?

Az eddigi fejezetekben már használtunk middleware-t, csak nem neveztük néven:

A middleware egy függvény, amely a kérés és a válasz között fut le. Három paramétert kap:

function naplozo(req, res, next) {
  console.log(`${req.method} ${req.originalUrl}`);
  next();                                  // ← továbbadjuk a következőnek
}

app.use(naplozo);
ParaméterMi ez?
reqA kérés — ugyanaz, amit a kezelőfüggvényben látsz, és módosíthatod
resA válasz — ezzel akár le is zárhatod a kérést
nextEgy függvény, amit meghívva továbbadod a vezérlést a láncban következőnek

A next a lényeg. Enélkül a middleware nem különbözne egy sima kezelőfüggvénytől.

Kezelőfüggvény vagy middleware?

Igazából ugyanaz. Az egyetlen különbség a szándék:

MiddlewareKezelőfüggvény (route handler)
Mit csinál?Előkészít, ellenőriz, naplózVálaszol a kérésre
Hogyan végződik?next() hívássalVálaszküldéssel (res.json()…)
Hol áll?A lánc elején (vagy középen)A lánc végén

Ezért írhattuk a 4. fejezetben, hogy az útvonalnak több függvénye is lehet: az első néhány middleware-ként viselkedik, az utolsó válaszol.

2A lánc

Az Express minden kérésnél sorban végigmegy a regisztrált függvényeken, felülről lefelé:

const app = express();

app.use(morgan("dev"));            // 1. naplóz, majd next()
app.use(express.json());           // 2. beolvassa a törzset, majd next()
app.use(hitelesites);              // 3. ellenőriz, majd next() vagy hibát ad

app.get("/api/products", kezelo);  // 4. VÁLASZOL — itt megáll a lánc

app.use(nemTalalhato);             // 5. csak akkor fut le, ha semmi nem válaszolt
app.use(hibakezelo);               // 6. csak hiba esetén fut le
BEÉRKEZŐ KÉRÉS morgan("dev") naplóz, majd next() express.json() req.body, majd next() hitelesites next() VAGY next(hiba) app.get("/api/products") VÁLASZOL — itt megáll nemTalalhato (404) csak ha semmi nem válaszolt next(hiba) átugorja a köztes lépéseket hibakezelo (err, req, res, next) — NÉGY paraméter A VÁLASZ ELMEGY A KLIENSNEK innentől a lánc többi tagja már nem fut le A LEGFONTOSABB SZABÁLY Egy middleware csak azokra a kérésekre hat, amelyek később érkeznek hozzá a láncban — vagyis csak azokra az útvonalakra, amelyeket UTÁNA regisztráltál. Ezért kerül minden közös middleware a fájl elejére.
1. ábra — A lánc. A válasznál megáll, a next(hiba) pedig átugrik a hibakezelőhöz.

A nyomvonal (egy naplózó middleware jegyezte fel a lépéseket):

GET /api/x   →   ["1 globális", "2 csak /api alatt", "3 útvonal-middleware", "4 kezelő"]
GET /nincs   →   ["1 globális", "404-kezelő"]

Figyeld meg a második sort: a /nincs kérésnél a globális middleware lefutott, csak nem talált végpontot, ezért a lánc végén álló 404-kezelőhöz jutott.

Mi fut le, és milyen sorrendben?

Adott egy lánc abban a sorrendben, ahogy a kódban áll, és egy beérkező kérés. Válaszd ki, melyik függvény fut le elsőként, illetve melyik utolsóként — a kérdés mindig megmondja, melyik érdekel.

1 / 6Helyes: 0
…

3Háromféle befejezés

Minden middleware pontosan egyféleképpen fejeződhet be. Ha egyiket sem teszi meg, a kérés örökre lóg.

MIDDLEWARE (req, res, next) next() „végeztem, jöhet a következő” A lánc folytatódik. res.json(…) „én válaszolok, nincs tovább” A lánc MEGÁLL. next(hiba) „baj van” Ugrás a hibakezelőhöz. ÉS HA EGYIK SEM? A kérés időtúllépésig lóg — hibaüzenet nélkül. Ez a legnehezebben megtalálható hiba. Ez a leggyakoribb eset. Utána semmi nem fut le. A köztes lépések kimaradnak.
2. ábra — Háromféle szabályos befejezés, és a negyedik, ami hiba.

1. next() — továbbadás

app.use((req, res, next) => {
  req.kertIdo = new Date();      // hozzáteszünk valamit a kéréshez
  next();                        // és megyünk tovább
});

2. Válasz — a lánc megáll

app.use((req, res, next) => {
  if (!req.get("Authorization")) {
    return res.status(401).json({ error: { message: "Bejelentkezés szükséges." } });
  }
  next();
});

Figyeld meg a return-t: enélkül a next() is lefutna a válasz után. Ugyanaz a szabály, mint az 5. fejezetben — egy kérésre egy válasz.

3. next(hiba) — ugrás a hibakezelőhöz

app.use((req, res, next) => {
  const id = Number(req.query.id);
  if (Number.isNaN(id)) {
    return next(new Error("Az azonosító nem szám."));
  }
  next();
});

Az eredmény: a next(new Error("kézzel dobott hiba")) hívás után a lánc átugorja az összes közbeeső middleware-t és útvonalat, és egyenesen a négyparaméteres hibakezelőhöz megy — onnan 500-as válasz születik.

A next() ÉS A next(hiba) KÜLÖNBSÉGE MINDÖSSZE EGY PARAMÉTER

Ha a next bármilyen értéket kap (a "route" szó kivételével), az Express hibának tekinti. Ezért soha ne írj ilyet: next(termek) — abból hiba lesz.

Ha egyik sem történik meg

app.get("/lefagy", (req, res, next) => {
  console.log("ide eljutok");
  // nincs next(), nincs válasz
});

Kipróbálva: a kérés időtúllépésig lóg, és nincs hibaüzenet. A böngésző pörög, a terminál néma. Ez a middleware-ek leggyakoribb, legnehezebben megtalálható hibája.

HA A KÉRÉS LÓG, KERESD A HIÁNYZÓ next() HÍVÁST

Minden ágon vagy next()-nek, vagy válaszküldésnek kell lennie — a korai kilépéseknél is.

4Hol fusson? Négyféle hatókör

// 1) GLOBÁLIS — minden kérésre
app.use(naplozo);

// 2) ELŐTAGHOZ KÖTÖTT — csak a /api alatt
app.use("/api", hitelesites);

// 3) ÚTVONAL-SZINTŰ — csak ezen az egy végponton
app.delete("/api/products/:id", adminKell, torloKezelo);

// 4) ROUTEREN BELÜLI — a router minden útvonalára
const router = express.Router();
router.use(termekLetezik);
HATÓKÖR GET /allapot GET /api/products GET /api/products/9 DELETE /api/products/9 app.use(fv) globális ✓ ✓ ✓ ✓ app.use("/api", fv) előtaghoz kötött ✗ ✓ ✓ ✓ router.use(fv) a termék-routeren belül ✗ ✓ ✓ ✓ app.delete(minta, fv, kezelo) útvonal-szintű ✗ ✗ ✗ ✓ Fentről lefelé egyre szűkül a hatókör. A 2. és a 3. sor ugyanarra a kérés-halmazra hat — a különbség csak az, hol írod le.
3. ábra — Ugyanaz a négy kérés, négyféle hatókörrel.
HatókörÍrásmódMikor használd?
Globálisapp.use(fv)Naplózás, törzs-feldolgozás, biztonsági fejlécek
Előtaghoz kötöttapp.use(elotag, fv)„Az egész /api mögé bejelentkezés kell”
Útvonal-szintűapp.get(minta, fv1, fv2)Egyetlen végpont extra ellenőrzése
Routeren belülirouter.use(fv)Egy erőforrás összes végpontjára

Az előtag „lekopik” a req.url-ről

Ha előtaghoz kötött middleware-t vagy routert használsz, a middleware nem látja az előtagot:

app.use("/elotag", (req, res) => {
  res.json({ url: req.url, baseUrl: req.baseUrl, originalUrl: req.originalUrl });
});

Az eredmény a GET /elotag/melyebb/utvonal kérésre:

{ "url": "/melyebb/utvonal", "baseUrl": "/elotag", "originalUrl": "/elotag/melyebb/utvonal" }

Ez ugyanaz a viselkedés, amit a 4. fejezetben a routereknél láttunk — és pontosan ezért működik a router relatív útvonalakkal.

NAPLÓZÁSHOZ MINDIG req.originalUrl

A req.url egy előtaghoz kötött middleware-ben csonkolt, és félrevezető naplósorokat adna.

5Beépített middleware-ek

Az Express hármat hoz magával. Külön csomag egyikhez sem kell.

MiddlewareMit csinál?Hol vettük?
express.json()A JSON törzset dolgozza fel a req.body-ba5. fejezet
express.urlencoded()Ugyanez űrlapadathoz5. fejezet
express.static()Fájlokat szolgál ki egy mappábólitt és a 7. fejezetben

express.static()

app.use(express.static("public"));

Ettől a public/proba.txt fájl a GET /proba.txt címen érhető el (kipróbálva). Vedd észre: a mappa neve nem része az URL-nek.

Ha mégis kell előtag:

app.use("/statikus", express.static("public"));   // → GET /statikus/proba.txt

Beállítási lehetőségek

KulcsLehetséges értékekAlapértékMit csinál?
indexfájlnév vagy false"index.html"Melyik fájlt adja vissza, ha mappát kérnek. false esetén semmit
maxAgeezredmásodperc vagy "1d", "1h"0Meddig gyorsítótárazhatja a böngésző (Cache-Control fejléc)
dotfiles"allow" / "deny" / "ignore""ignore"Mi legyen a ponttal kezdődő fájlokkal (pl. .env). Az "ignore" úgy tesz, mintha nem lennének
extensionskiterjesztések tömbjefalseHa nincs találat, kipróbálja ezekkel is (pl. ["html"] → a /rolunk megtalálja a rolunk.html-t)
redirecttrue / falsetrueMappa kérésénél tegyen-e záró perjelet a végére
A dotfiles ALAPÉRTÉKE JÓ

Az "ignore" miatt a public/.env fájl nem kerül ki a hálózatra. Ezt soha ne állítsd "allow"-ra.

A MAPPA MEGADÁSÁRÓL A 7. FEJEZETBEN LESZ SZÓ

A fenti express.static("public") írásmódnak van egy csapdája: az útvonalat nem a fájlhoz, hanem az indítási mappához képest értelmezi. A következő fejezetben megnézzük, miért, és hogyan kerüljük el.

6Saját middleware írása

a) Naplózó

export function naplozo(req, res, next) {
  const kezdet = Date.now();

  res.on("finish", () => {                       // amikor a válasz elment
    const ido = Date.now() - kezdet;
    console.log(`${req.method} ${req.originalUrl} ${res.statusCode} — ${ido} ms`);
  });

  next();
}
ElemMit csinál?
Date.now()Az aktuális idő ezredmásodpercben — a kezdet és a vég különbsége adja az időtartamot
res.on("finish", fv)A válasz elküldése után hívja meg a függvényt — csak ekkor ismert a státuszkód
next() a végénEnélkül a kérés soha nem jutna el a végponthoz

A next() azonnal lefut, nem várja meg a finish eseményt. A naplósor később, a válasz után íródik ki.

b) A req kiegészítése

app.use((req, res, next) => {
  req.kertIdo = new Date().toISOString();
  next();
});

app.get("/api/idopont", (req, res) => {
  res.json({ mikor: req.kertIdo });          // működik
});

Ez a minta lesz a hitelesítés alapja a 4. blokkban: a token ellenőrzése után a middleware req.felhasznalo = { id: 5, szerep: "admin" } alakban teszi be a bejelentkezett felhasználót.

HASZNÁLJ EGYEDI, BESZÉDES NEVET

A req.adat vagy a req.data könnyen ütközhet egy külső csomag által használt névvel. A req.kertIdo, req.felhasznalo sokkal biztonságosabb.

c) res.locals — adat a válaszhoz

app.use((req, res, next) => {
  res.locals.valaszIdo = new Date().toISOString();
  next();
});

A res.locals egy objektum, amely egyetlen kérés-válasz párhoz tartozik. Példa:

{ "kertIdo": "2026-08-29T12:00:00.000Z", "locals": { "felhasznalo": "teszt" } }
req.sajatMezores.locals.sajatMezo
Mire szánták?A kérésről szóló adat (ki küldte, mikor)A válaszhoz szánt adat
Kik látják?A későbbi middleware-ek és a kezelőUgyanazok, plusz a sablonmotorok
Melyiket használjuk?Ezt — mi nem használunk sablonmotortRitkábban

d) Ellenőrző middleware

export function ervenyesAzonosito(req, res, next) {
  const id = Number(req.params.id);

  if (!Number.isInteger(id) || id < 1) {
    return res.status(400).json({
      error: { message: "Az azonosító csak pozitív egész szám lehet.", code: "ERVENYTELEN_ID" }
    });
  }

  req.termekId = id;        // átadjuk a már átalakított értéket
  next();
}
router.get("/:id", ervenyesAzonosito, (req, res) => {
  const termek = termekek.find(t => t.id === req.termekId);   // már szám!
  // …
});

Ezzel a 4. fejezet buktatóját egyszer és mindenkorra megoldottuk: a kezelőfüggvényben már számot kapunk, és a hibás azonosító ide sem jut el.

7Hasznos külső middleware-ek

Mindhárom ingyenes, MIT-licencű npm-csomag, teljes funkcionalitással.

npm install morgan cors helmet

Ellenőrzött verziók: morgan 1.12.0, cors 2.8.6, helmet 8.3.0.

morgan — naplózás

import morgan from "morgan";

app.use(morgan("dev"));

Így néz ki a napló munka közben

Kattints a kérésekre, és nézd, hogyan gyűlnek a naplósorok. Ez az egyetlen hely a fejezetben, ahol terminált szimulálunk — a napló időben bővülő kimenet, statikus kódblokk nem adja vissza jól.

terminal — webshop-api
Indítsd el a szervert a gombbal.

A morgan „dev” formátuma: metódus · útvonal · státuszkód · idő · válaszméret.

RészMit jelent?
GET /localsMetódus és útvonal
200Státuszkód — színesen: zöld 2xx, sárga 4xx, piros 5xx
4.923 msMennyi ideig tartott a kérés kiszolgálása
- 71A válasz törzsének mérete bájtban

Formátumok

FormátumMit ad?Mikor használd?
"dev"Rövid, színes sorFejlesztés közben — ezt használjuk
"tiny"A legrövidebb, szín nélkülHa sok kérés van, és csak áttekintés kell
"common"Szabványos webszerver-naplóformátumHa naplóelemző eszközbe megy
"combined"Mint a common, plusz hivatkozó és böngészőÉles rendszerben

cors — kérések másik forrásból

import cors from "cors";

app.use(cors());

Ez hozzáadja az Access-Control-Allow-Origin: * fejlécet, vagyis bármelyik weboldal hívhatja az API-dat.

MI AZ A CORS?

Cross-Origin Resource Sharing — böngészőbeli biztonsági szabály. A böngésző alapból megtiltja, hogy a http://localhost:5173 címen futó frontend adatot kérjen a http://localhost:3000 címen futó API-tól, mert más a forrás (origin: séma + host + port). A szervernek kell engedélyt adnia — ezt teszi ez a middleware.

KulcsLehetséges értékekAlapértékMit csinál?
origin"*", konkrét cím, címek tömbje, vagy függvény"*"Ki hívhatja az API-t
methodsmetódusnevek tömbje vagy szövege"GET,HEAD,PUT,PATCH,POST,DELETE"Mely metódusok engedélyezettek
allowedHeadersfejlécnevek tömbjea kliens kérése szerintMely fejléceket küldhet a kliens (pl. Authorization)
credentialstrue / falsefalseKüldhet-e a böngésző sütiket a kéréssel

Éles rendszerben ne hagyd "*"-on:

app.use(cors({ origin: "https://webshop.example.com" }));

helmet — biztonsági fejlécek

import helmet from "helmet";

app.use(helmet());

Egyetlen sorral tizenegy biztonsági fejlécet állít be. A lista (helmet 8.3.0):

FejlécÉrtékeMi ellen véd?
Content-Security-Policydefault-src 'self'; …Idegen forrásból betöltött szkriptek
Cross-Origin-Opener-Policysame-originMás lapok hozzáférése az ablakodhoz
Cross-Origin-Resource-Policysame-originAz erőforrásaid beágyazása idegen oldalba
Origin-Agent-Cluster?1Más oldalakkal közös memóriakezelés
Referrer-Policyno-referrerAz URL kiszivárgása a hivatkozott oldalnak
X-Content-Type-OptionsnosniffA böngésző „kitalálja” a fájltípust
X-DNS-Prefetch-ControloffElőzetes DNS-lekérdezés, ami adatot szivárogtat
X-Download-OptionsnoopenRégi Internet Explorer letöltési viselkedése
X-Frame-OptionsSAMEORIGINAz oldalad idegen keretbe ágyazása (clickjacking)
X-Permitted-Cross-Domain-PoliciesnoneRégi Flash- és PDF-kliensek hozzáférése
X-XSS-Protection0Szándékosan kikapcsolva — a régi böngészőszűrő maga volt biztonsági rés
HA JSON API-T ÍRSZ, A helmet() ALAPBEÁLLÍTÁSA JÓ

A Content-Security-Policy főleg HTML-oldalaknál számít; JSON-válaszoknál nem zavar. Ha statikus HTML-t is kiszolgálsz, és a lapod nem tölt be semmit idegen forrásból, azt érdemes külön beállítani — de ez már túlmutat a mi tananyagunkon.

A helyes sorrend

const app = express();

app.use(helmet());                  // 1. biztonsági fejlécek — mindenre
app.use(cors());                    // 2. CORS-fejlécek
app.use(morgan("dev"));             // 3. naplózás
app.use(express.json());            // 4. törzs-feldolgozás

app.use("/api/products", termekRouter);   // 5. útvonalak

app.use(nemTalalhato);              // 6. 404
app.use(hibakezelo);                // 7. hibakezelő — MINDIG a legvégén

Hol a helye a láncban?

Hat middleware. Döntsd el mindegyikről, a lánc melyik szakaszába való.

1 / 6Helyes: 0
…

8A hibakezelő middleware

Az Express egyetlen dolog alapján ismeri fel: négy paramétere van, és az első a hiba.

app.use((err, req, res, next) => {          // ← NÉGY paraméter!
  console.error(err);
  res.status(err.status || 500).json({
    error: { message: err.message, code: "SZERVERHIBA" }
  });
});
ParaméterMi ez?
errA hiba, ami a next(err) hívásból vagy egy throw-ból származik
req, resA szokásos kérés és válasz
nextTovábbadás egy másik hibakezelőnek — ritkán kell
A NÉGY PARAMÉTER KÖTELEZŐ, MÉG HA NEM IS HASZNÁLOD

Ha lehagyod a next-et, az Express háromparaméteres, közönséges middleware-nek nézi, és soha nem adja át neki a hibákat. A szerkesztő figyelmeztethet a nem használt paraméterre — itt ez rendben van.

A helye: a lánc legvégén

Ez a fejezet második nagy buktatója. Kipróbálva mindkét sorrend:

Hibakezelő az útvonalak ELŐTTSOHA NEM FUT LE
app.use((err, q, s, n) => …);   // ❌
app.get("/hiba", () => { throw … });
500  <!DOCTYPE html> … <pre>Error: bumm  at …</pre>
Hibakezelő az útvonalak UTÁNHELYES
app.get("/hiba", () => { throw … });
app.use((err, q, s, n) => …);   // ✅
500  {"hol":"helyes hibakezelo","uzenet":"bumm"}

Miért? Mert a hibakezelő is a láncban van. Ha az útvonalak előtt regisztrálod, a hiba később keletkezik, mint ahol ő áll — és a lánc nem megy visszafelé.

A RÉSZLETEK A 8. FEJEZETBEN JÖNNEK

Egyedi hibaosztályok, státuszkódok, éles környezet, aszinkron hibák — mindez a következő utáni fejezet témája. Itt csak a szerkezetet (négy paraméter) és a helyét (a lánc legvégén) kellett megérteni.

9Gyakori hibák

A kérés lóg, nincs hibaüzenet

app.use((req, res, next) => {
  console.log("naplózás");
  // ❌ elmaradt a next()
});

Tünet: minden kérés időtúllépésre fut, a terminál néma.
Megoldás: minden ágon next() vagy válaszküldés.

req.body az undefined — pedig ott az express.json()

app.post("/korai", kezelo);        // ❌ ez ELŐBB van
app.use(express.json());
app.post("/kesoi", kezelo);        // ✅ ez már látja a törzset

Az eredmény:

POST /korai  →  {"tipus":"undefined"}
POST /kesoi  →  {"body":{"a":1},"tipus":"object"}

Megoldás: az express.json() a fájl elejére, minden útvonal elé.

A hibakezelő HTML-t küld

Tünet: a hibaválasz HTML, nem a saját JSON-formátumod.
Ok: a hibakezelő az útvonalak előtt áll, vagy csak három paramétere van.
Megoldás: négy paraméter, és a lánc legvégére.

next() a válasz után

app.get("/utana", (req, res, next) => {
  res.json({ elso: true });
  next();                          // ❌
});

Kipróbálva: a kliens megkapja az első választ (200), de a lánc továbbmegy a 404-kezelőhöz, ami újra válaszolni próbál — a terminálban ERR_HTTP_HEADERS_SENT jelenik meg. A szerver fut tovább, tehát semmi nem hívja fel rá a figyelmedet.
Megoldás: return res.json(…).

Rossz helyen álló app.use("/api", …)

app.use("/api", hitelesites);
app.get("/api/products", kezelo);       // ✅ ide kell a hitelesítés
app.get("/allapot", kezelo);            // ✅ ide nem — jó, hogy kimarad

Ha az előtagot lehagyod, a /allapot végpont is bejelentkezést követelne — beleértve azt az állapot-ellenőrző végpontot, aminek épp bejelentkezés nélkül kell működnie.

next(valami) hibának minősül

next(termek);        // ❌ ebből hiba lesz, nem adatátadás!

Megoldás: adatot a req objektumon adj tovább (req.termek = termek; next();).

10Feladatok

Elméleti

F1⭐Hányféleképpen végződhet?

Sorold fel a middleware háromféle befejezését, és mondj mindegyikre egy konkrét példát a webshop API-ból!

F2⭐Mi fut le?

Adott ez a sorrend. Írd le, mely függvények futnak le a GET /api/products és mely a GET /allapot kérésre!

app.use(naplozo);
app.use("/api", hitelesites);
app.get("/allapot", allapotKezelo);
app.get("/api/products", termekKezelo);
app.use(nemTalalhato);
F3⭐⭐Hibakeresés

Miért undefined a req.body?

const app = express();
app.post("/api/products", (req, res) => res.json(req.body));
app.use(express.json());
app.listen(3000);
F4⭐⭐Miért lóg a kérés?

Mi a hiba, és mi a tünete?

app.use((req, res, next) => {
  if (req.get("Authorization")) {
    next();
  }
});
F5⭐⭐⭐Tervezz láncot

Írd le a webshop API teljes middleware-láncát a helyes sorrendben, a biztonsági fejlécektől a hibakezelőig. Mindegyik sorhoz írj egy mondatot arról, miért pont ott van a helye!

Gyakorlati

G1⭐Saját naplózó

Írj middleware-t, amely minden kérésnél kiírja a metódust, a teljes útvonalat, a státuszkódot és a kiszolgálás idejét. Hasonlítsd össze a morgan("dev") kimenetével!

G2⭐⭐Kérés-azonosító

Írj middleware-t, amely minden kéréshez egyedi azonosítót rendel (req.kerelemAzonosito), beteszi a válasz X-Request-Id fejlécébe, és a naplósorban is megjeleníti. Az azonosítót a beépített crypto.randomUUID() függvénnyel állítsd elő!

G3⭐⭐Ellenőrző middleware

Emeld ki a 4. fejezet azonosító-ellenőrzését külön middleware-be (ervenyesAzonosito), és használd mind a GET /:id, PUT /:id, DELETE /:id végpontban. Bizonyítsd be, hogy a hibás azonosító már a kezelőfüggvény előtt megáll!

G4⭐⭐Külső csomagok

Telepítsd és állítsd be a morgan, cors és helmet csomagokat. REST Clientben nézd meg a válasz fejléceit előtte és utána, és készíts táblázatot arról, mi változott!

G5⭐⭐⭐Egyszerű hitelesítés

Írj middleware-t, amely megköveteli az Authorization: Bearer titok123 fejlécet minden /api alatti kérésnél. Hiányzó fejléc → 401, rossz érték → 403, egységes hibaformátumban. Az /allapot végpont maradjon szabadon elérhető! (A valódi JWT-alapú megoldás a 4. blokkban jön.)

11Önellenőrző kvíz

0 / 10 megválaszolva

12Összegzés

  1. A middleware a kérés és a válasz között lefutó függvény: (req, res, next). A kezelőfüggvénytől csak a szándék különbözteti meg.
  2. Az Express a regisztrált függvényeken fentről lefelé halad végig. Egy middleware csak azokra az útvonalakra hat, amelyeket utána regisztráltál.
  3. Háromféle befejezés van: next() (tovább), válaszküldés (megáll), next(hiba) (ugrás a hibakezelőhöz). Ha egyik sem történik meg, a kérés örökre lóg — hibaüzenet nélkül.
  4. A hatókör négyféle lehet: globális, előtaghoz kötött, útvonal-szintű és routeren belüli. Előtag esetén az előtag lekopik a req.url-ről.
  5. Beépített middleware-ek: express.json(), express.urlencoded(), express.static() — mindhez tartoznak beállítások, de az alapértékek jók.
  6. Saját middleware-rel naplózunk, ellenőrzünk, és a req objektumon adunk tovább adatot (req.termekId, később req.felhasznalo).
  7. Három hasznos külső csomag: morgan (naplózás), cors (más forrásból érkező kérések), helmet (11 biztonsági fejléc egy sorból).
  8. A hibakezelő négyparaméteres, és a lánc legvégére kell. Rossz helyen soha nem fut le, és az Express HTML-oldalt küld helyette.

13Fogalomtár

FogalomJelentés
MiddlewareA kérés és a válasz között lefutó függvény, (req, res, next) paraméterekkel
Lánc (stack)A regisztrált middleware-ek és útvonalak sorrendje
next()Továbbadja a vezérlést a láncban következőnek
next(hiba)Átugrik a hibakezelőhöz
next("route")Kihagyja az adott útvonal többi függvényét, és a következő illeszkedő útvonalra ugrik
Hibakezelő middlewareNégy paraméteres függvény: (err, req, res, next)
app.use(fv)Globális middleware
app.use(előtag, fv)Csak az előtag alá eső kérésekre
req.originalUrlA teljes kért útvonal — naplózáshoz ezt használjuk
res.localsEgyetlen kérés-válasz párhoz tartozó adatok objektuma
express.static()Beépített middleware fájlok kiszolgálására
morganNaplózó middleware-csomag
CORSCross-Origin Resource Sharing — böngészőbeli szabály a más forrásból érkező kérésekre
helmetBiztonsági HTTP-fejléceket beállító csomag
← Előző 5. Kérés és válasz