CodeBlanks Logo Icon CodeBlanks

Middleware

Logging, error ve validation middleware'ları eklersin.

Ara katman (middleware)

Middleware, her istekten önce çalışan bir fonksiyondur. Örneğin istek yöntemini yazdıran bir ara katman, gelen tüm istekleri günlüğe kaydeder. Express'te app.use(fn) ile kaydedilir; fn üç parametre alır: (req, res, next).

İşlem bitince next() çağrılır; bu, bir sonraki ara katmana veya rotaya geçişi sağlar. next çağrılmazsa istek askıda kalır. Örnek: (req, res, next) => { console.log('İstek: ' + req.method); next(); }. Birden çok ara katmanı bir dizide toplayıp app.use(middleware[0]) ile tek tek kaydedebilirsin. Ara katman sayısını middleware.length ile yazdırırsın.

Ara katman dizisi

Birden çok ara katmanı bir dizide tutmak, sıralarını denetlemeyi kolaylaştırır. const middleware = [] tanımlar, middleware.push(fn) ile eklersin. Sonra app.use(middleware[0]) ile Express'e kaydedersin.

İlk ara katman istek yöntemini yazdırır: middleware.push((req, res, next) => { console.log('İstek: ' + req.method); next(); }). app.use(middleware[0]) ile kaydedersin. console.log('Ara katman: ' + middleware.length) ile kaç tane olduğunu yazdırırsın. Dizi, ara katmanların sırasını ve sayısını tek yerden yönetmeni sağlar. İleride ikinci bir ara katman eklemek istersen middleware.push(...) ile diziye ekler, app.use(middleware[1]) ile kaydedersin.

Uygulama Ara katman ekle

const middleware = [] tanımla. middleware.push((req, res, next) => { console.log('İstek: ' + req.method); next(); }) ekle. app.use(middleware[0]) ile kaydet. console.log('Ara katman: ' + middleware.length) yazdır.

Başlangıç kodu

index.js
const express = require('express');
const app = express();
const routes = [];
app.get('/health', (req, res) => res.json({ok: true}));
routes.push({method: 'GET', path: '/health'});
console.log('Sunucu hazır');
app.get('/users', (req, res) => res.json([]));
routes.push({method: 'GET', path: '/users'});
app.post('/users', (req, res) => res.json({created: true}));
routes.push({method: 'POST', path: '/users'});
console.log('Rotalar: ' + routes.map(r => r.method + ' ' + r.path).join(', '));
const fs = require('fs');
const DB_PATH = '/tmp/nodejs-i20.json';
function saveUsers(data) {
  fs.writeFileSync(DB_PATH, JSON.stringify(data));
}
function loadUsers() {
  return JSON.parse(fs.readFileSync(DB_PATH, 'utf8'));
}
saveUsers({users: ['Ayşe', 'Alex']});
console.log('Yüklendi: ' + JSON.stringify(loadUsers()));

// middleware dizisi tanımla
// istek yöntemini yazdıran ara katman ekle
// app.use ile kaydet, sayıyı yazdır
// buraya yaz

Örnek çözüm

index.js
const express = require('express');
const app = express();
const routes = [];
app.get('/health', (req, res) => res.json({ok: true}));
routes.push({method: 'GET', path: '/health'});
console.log('Sunucu hazır');
app.get('/users', (req, res) => res.json([]));
routes.push({method: 'GET', path: '/users'});
app.post('/users', (req, res) => res.json({created: true}));
routes.push({method: 'POST', path: '/users'});
console.log('Rotalar: ' + routes.map(r => r.method + ' ' + r.path).join(', '));
const fs = require('fs');
const DB_PATH = '/tmp/nodejs-i20.json';
function saveUsers(data) {
  fs.writeFileSync(DB_PATH, JSON.stringify(data));
}
function loadUsers() {
  return JSON.parse(fs.readFileSync(DB_PATH, 'utf8'));
}
saveUsers({users: ['Ayşe', 'Alex']});
console.log('Yüklendi: ' + JSON.stringify(loadUsers()));
const middleware = [];
middleware.push((req, res, next) => { console.log('İstek: ' + req.method); next(); });
app.use(middleware[0]);
console.log('Ara katman: ' + middleware.length);

Beklenen çıktı

Sunucu hazır
Rotalar: GET /health, GET /users, POST /users
Yüklendi: {"users":["Ayşe","Alex"]}
Ara katman: 1

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 next() çağrılmazsa ne olur?

index.js
(req, res, next) => { console.log(req.method); }
  • İstek hemen yanıtlanır
  • Sunucu çöker
  • İstek askıda kalır Doğru cevap
  • Hata fırlatır

Açıklama: next() çağrılmazsa istek askıda kalır, rota işleyiciye geçilmez.

2 Parçayı rolüne eşle

Kavram Anlamı
app.use Ara katmanı kaydeder
next() Sonrakine geçer
req.method İstek yöntemi
middleware.push Ara katmanı diziye ekler

3 app.use satırını tamamla

Soru
app.____(middleware[0]);
Cevap
app.use(middleware[0]);

Açıklama: app.use ara katmanı kaydeder.

Orta seviye bölümündeki tüm dersler