Menu
CoddyTech

Redirections

Fait partie de la section Les bases d’Express du Journey Node.js de Coddy. Leçon 10 sur 20.

Les pages changent d’adresse, et les anciens liens dans les favoris et les résultats de recherche devraient toujours mener quelque part.

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

Une redirection renvoie un statut et un en-tête Location indiquant la nouvelle URL, et le navigateur demande aussitôt cette URL. res.redirect définit les deux.

Le statut indique combien de temps dure le changement d’adresse. 301 signifie que le changement est définitif : les navigateurs et les moteurs de recherche mémorisent la nouvelle adresse et cessent de demander l’ancienne. 302, le statut par défaut si vous n’en indiquez aucun, signifie que le changement est temporaire ; ils continuent donc à utiliser l’ancienne URL.

challenge icon

Défi

Facile
  • GET /menu a été définitivement déplacé vers /recipes.
  • GET /menu/:id a été déplacé vers /recipes/:id, avec le même id.

Envoyez GET /menu/3 et lisez le statut ainsi que l’en-tête Location. Envoyez aussi GET /menu/42.

Essayez vous-même

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') envoie du texte brut, donc chaque titre s’affiche sur sa propre ligne.
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');
});

Toutes les leçons de Les bases d’Express