Express.js'te middleware nedir ve nasıl çalışır?

Cevap

Middleware, istek (req) ile yanıt (res) arasında sırayla çalışan fonksiyonlardır. Her biri isteği değiştirebilir, yanıtı bitirebilir ya da next() çağırarak sıradakine devredebilir. Kimlik doğrulama, loglama, body parsing, CORS, rate limiting gibi kesişen işler middleware ile yapılır.

import express from "express";
const app = express();

// 1. Uygulama seviyesi: her istekte çalışır
app.use(express.json());

app.use((req, res, next) => {
  const bas = Date.now();
  res.on("finish", () => console.log(req.method, req.url, Date.now() - bas, "ms"));
  next();
});

// 2. Route seviyesi
function yetkiKontrol(req, res, next) {
  if (!req.headers.authorization) {
    return res.status(401).json({ hata: "Yetkisiz" });  // zinciri keser
  }
  req.kullanici = { id: 1 };
  next();
}

app.get("/profil", yetkiKontrol, (req, res) => res.json(req.kullanici));

// 3. Hata middleware'i: 4 parametre, en sonda tanımlanır
app.use((err, req, res, next) => {
  console.error(err);
  res.status(err.status || 500).json({ hata: "Sunucu hatası" });
});

Önemli kurallar

  • Sıra önemlidir: middleware'ler tanımlanma sırasıyla çalışır. express.json() route'lardan önce gelmelidir.
  • Bir middleware ya yanıt göndermeli ya da next() çağırmalıdır; ikisini de yapmazsa istek asılı kalır.
  • next(err) çağrısı normal middleware'leri atlayıp doğrudan hata middleware'ine gider.
  • Hata middleware'i, Express tarafından 4 parametreli olmasından tanınır.
  • express.Router() ile middleware'ler belirli bir route grubuna uygulanabilir: app.use("/admin", adminRouter).
  1. cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?ZorNode.jsBackend
  2. Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?ZorNode.jsBackend
  3. Node.js'te asenkron kodda hata yönetimi nasıl yapılır? unhandledRejection nedir?OrtaNode.jsBackend
  4. Node.js'te stream nedir? Türleri nelerdir ve backpressure ne demektir?OrtaNode.jsBackend
  5. process.nextTick, Promise.then, setImmediate ve setTimeout(fn, 0) hangi sırayla çalışır?OrtaNode.jsBackend
  6. CommonJS ile ES Modules (ESM) arasındaki fark nedir?KolayNode.jsBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle