Menu
CoddyTech

Sıralama Önemlidir

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

Express, ara yazılımı ve rotaları kodunuza eklediğiniz sırayla çalıştırır ve 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

Sayfalar ve dosyalar dâhil her yanıt, yeni bir randomUUID() değerini içeren bir X-Request-Id başlığı taşır; bu değer node:crypto modülünden gelir.

GET /api/recipes isteğini iki kez gönderip başlıkları karşılaştır, ardından GET /style.css isteğini gönder.

Kendin dene

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'));

const escapeHtml = (text) =>
    text
        .replaceAll('&', '&')
        .replaceAll('<', '&lt;')
        .replaceAll('>', '&gt;')
        .replaceAll('"', '&quot;');

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, bu nedenle 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