Menu
CoddyTech

Weiterleitungen

Teil des Abschnitts Express-Grundlagen der Node.js-Journey von Coddy. Lektion 10 von 20.

Seiten ändern sich, und alte Links in Lesezeichen und Suchergebnissen sollten weiterhin zu einem Ziel führen.

app.get('/old-prices', (req, res) => {
    res.redirect(301, '/prices');
});

Eine Weiterleitung antwortet mit einem Status und einem Location-Header, der die neue URL angibt, und der Browser ruft diese URL sofort auf. res.redirect setzt beides.

Der Status gibt an, wie lange die Änderung gilt. 301 bedeutet dauerhaft verschoben: Browser und Suchmaschinen merken sich die neue Adresse und fragen nicht mehr nach der alten. 302, der Standardwert, wenn du keinen Status übergibst, bedeutet vorübergehend, sodass sie weiterhin die alte URL verwenden.

challenge icon

Aufgabe

Einfach
  • GET /menu wurde endgültig nach /recipes verschoben.
  • GET /menu/:id wurde mit derselben ID nach /recipes/:id verschoben.

Sende GET /menu/3 und lies den Status sowie den Location-Header. Sende auch GET /menu/42.

Probier es selbst

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

const app = express();

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') sendet reinen Text, sodass jeder Titel in einer eigenen Zeile erscheint.
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.listen(3000, () => {
    console.log('Recipe Box is running on port 3000');
});

Alle Lektionen in Express-Grundlagen