CodeBlanks Logo Icon CodeBlanks

Birleştirme

Tüm katmanları birleştirerek çalışan bir API yazarsın.

İstek simülasyonu

Sunucuyu gerçekten başlatmadan bir isteğin akışını simüle edebiliriz. Sahte bir req nesnesi (method, url) ve sahte bir res nesnesi (json) tanımlar, bunları ara katmana geçiririz. Böylece middleware → rota zincirinin çıktısını kesin olarak görebiliriz.

Örnek: const req = {method: 'GET', url: '/users'} ve const res = {json: (d) => console.log('Yanıt: ' + JSON.stringify(d))}. Sonra middleware[0](req, res, () => { console.log('İşlendi: ' + req.method + ' ' + req.url); }) çağrılır. Ara katman önce 'İstek: GET' yazdırır, next() ile geri çağrıyı çalıştırır, geri çağrı 'İşlendi: GET /users' yazdırır. Bu, sunucu başlatmadan istek akışını doğrulamanın kesin ve hızlı yoludur.

Tüm parçalar birleşiyor

Son derste Express rotaları, fs kalıcılığı ve middleware birleşir. İstek geldiğinde önce middleware çalışır (yöntemi yazdırır), sonra rota işleyici veriyi döndürür. Veri dosyaya kaydedilip geri yüklenir; böylece sunucu yeniden başlasa bile kullanıcı listesi kalıcı olur.

Bu proje Express + fs + middleware birikimini sınar: rota kaydı (app.get/app.post), kalıcılık (saveUsers/loadUsers) ve ara katman (app.use). Her dersin başlangıç kodu önceki çözümü içerir; son dersin kodu tüm parçaları birleştirir. Çıktı, istek akışının kesin izidir: 'Sunucu hazır', 'Rotalar: ...', 'Yüklendi: ...', 'Ara katman: 1', 'İstek: GET', 'İşlendi: GET /users'.

Uygulama İstek simülasyonunu çalıştır

const req = {method: 'GET', url: '/users'} tanımla. const res = {json: (d) => console.log('Yanıt: ' + JSON.stringify(d))} tanımla. middleware[0](req, res, () => { console.log('İşlendi: ' + req.method + ' ' + req.url); }) çağı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()));
const middleware = [];
middleware.push((req, res, next) => { console.log('İstek: ' + req.method); next(); });
app.use(middleware[0]);
console.log('Ara katman: ' + middleware.length);

// simüle req nesnesi tanımla (method, url)
// simüle res nesnesi tanımla (json)
// middleware[0] çağır, next içinde işlendi 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);
const req = {method: 'GET', url: '/users'};
const res = {json: (d) => console.log('Yanıt: ' + JSON.stringify(d))};
middleware[0](req, res, () => {
  console.log('İşlendi: ' + req.method + ' ' + req.url);
});

Beklenen çıktı

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

Soru ve cevaplar

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

1 next() çağrısını tamamla

Soru
console.log('İstek: ' + req.method); ____();
Cevap
console.log('İstek: ' + req.method); next();

Açıklama: next() bir sonraki ara katmana veya rotaya geçer.

2 middleware[0](req, res, cb) çağrısında cb ne zaman çalışır?

index.js
middleware[0](req, res, () => { console.log('İşlendi'); })
  • Middleware öncesinde
  • Middleware içinde next() çağrılınca Doğru cevap
  • Hiçbir zaman
  • Sunucu kapanınca

Açıklama: cb, middleware içinde next() çağrılınca çalışır.

3 Parçayı rolüne eşle

Kavram Anlamı
app.get Rota kaydeder
saveUsers Veriyi dosyaya yazar
app.use Ara katmanı kaydeder
middleware[0] İlk ara katmanı çağırır

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