Menu
CoddyTech

Sıralama Önemlidir

Coddy'nin Node.js Journey'sinin Express Temelleri bölümünün bir parçası. Ders 14 / 23.

Express, ara yazılımları ve rotaları kodunuzun eklediği sırayla çalıştırır; yanıt veren bir rota isteği orada sonlandırır.

app.get('/bikes', (req, res) => {
    res.json(bikes);
});

app.use((req, res, next) => {
    res.set('Cache-Control', 'no-store');
    next();
});

res.set(name, value) yanıta bir başlık ekler ve yanıt gönderilmeden önce çalıştırılmalıdır. Burada GET /bikes, ara yazılıma ulaşılmadan önce yanıt verir; bu nedenle yanıtına hiçbir zaman başlık eklenmez: ara yazılım yalnızca üstündeki hiçbir rotanın yanıtlamadığı istekleri görür. Her yanıta uygulanması gereken ara yazılım, rotaların ve express.static öğesinin üstüne yerleştirilir.

challenge icon

Görev

Kolay

Her yanıt bir id alır; böylece bir ziyaretçi sorun bildirdiğinde isteğini günlüğünüzde bulabilirsiniz. Sayfalar, API verileri ve public içinden gönderilen dosyalar dahil her yanıtın bir id’si olmalıdır.

  1. server.js içinde randomUUID öğesini node:crypto içinden içe aktarın. Her çağrı, 3b241101-e2bb-4255-8caf-4136c566a962 gibi yeni ve rastgele bir id döndürür.
  2. Her istek için yeni bir randomUUID() içeren X-Request-Id adlı bir yanıt başlığı ayarlayan ve ardından next() çağrısı yapan bir ara katman ekleyin.
  3. Her isteğin, express.static tarafından gönderilen dosyalar da dahil olmak üzere bu ara katmandan geçeceği bir konuma yerleştirin. Bir yanıt bu başlığı yalnızca ara katman yanıt gönderilmeden önce çalışırsa alır.

Deneyin: Run’a basın ve /api/recipes isteğini iki kez gönderin. Headers sekmesinde X-Request-Id her seferinde farklı bir değere sahip olur. /style.css ve / isteklerini gönderin: her biri X-Request-Id başlığını da taşır.

Kendin dene

import { escapeHtml } from './html.js';
import express from 'express';
import { recipes } from './data.js';

const app = express();

app.use((req, res, next) => {
    console.log(`${req.method} ${req.url}`);
    next();
});

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

app.get('/', (req, res) => {
    const items = recipes.map((r) => `<li><a href="/recipes/${r.id}">${escapeHtml(r.title)}</a></li>`);
    res.send(`<link rel="stylesheet" href="/style.css"><h1>Recipe Box</h1><ul>${items.join('')}</ul>`);
});

// type('text') düz metin gönderir, böylece her başlık ayrı bir satırda görünür.
app.get('/recipes', (req, res) => {
    const { tag } = req.query;
    const list = tag ? recipes.filter((recipe) => recipe.tags.includes(tag)) : recipes;
    res.type('text').send(list.map((recipe) => recipe.title).join('\n'));
});

app.get('/recipes/:id', (req, res) => {
    const recipe = recipes.find((r) => r.id === Number(req.params.id));
    if (!recipe) {
        res.status(404).send('No such recipe');
        return;
    }
    res.send(recipe.title);
});

app.get('/api/recipes', (req, res) => {
    res.json(recipes);
});

app.get('/api/recipes/:id', (req, res) => {
    const recipe = recipes.find((r) => r.id === Number(req.params.id));
    if (!recipe) {
        res.status(404).json({ error: 'No such recipe' });
        return;
    }
    res.json(recipe);
});

app.get('/about', (req, res) => {
    res.send('Recipe Box collects family recipes.');
});

app.get('/menu', (req, res) => {
    res.redirect(301, '/recipes');
});

app.get('/menu/:id', (req, res) => {
    res.redirect(301, `/recipes/${req.params.id}`);
});

app.listen(3000, () => {
    console.log('Recipe Box is running on port 3000');
});

Express Temelleri bölümündeki tüm dersler

Kendi başına pratik yap: Express playground