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.
Aufgabe
EinfachGET /menuwurde endgültig nach/recipesverschoben.GET /menu/:idwurde mit derselben ID nach/recipes/:idverschoben.
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('<', '<')
.replaceAll('>', '>')
.replaceAll('"', '"');
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');
});