Menu
CoddyTech

Redirecciones

Parte de la sección Conceptos básicos de Express del Journey de Node.js de Coddy. Lección 10 de 20.

Las páginas cambian, y los enlaces antiguos de los marcadores y los resultados de búsqueda deberían seguir llevando a algún sitio.

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

Una redirección responde con un estado y un encabezado Location que indica la nueva URL, y el navegador solicita esa URL inmediatamente. res.redirect establece ambos.

El estado indica cuánto dura el cambio. 301 significa que el cambio es permanente: los navegadores y los motores de búsqueda recuerdan la nueva dirección y dejan de solicitar la antigua. 302, el valor predeterminado cuando no se pasa ningún estado, significa que el cambio es temporal, así que siguen usando la URL antigua.

challenge icon

Desafío

Fácil
  • GET /menu se ha trasladado definitivamente a /recipes.
  • GET /menu/:id se ha trasladado a /recipes/:id, con el mismo id.

Envía GET /menu/3 y lee el estado y el encabezado Location. Envía también GET /menu/42.

Pruébalo tú mismo

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') envía texto sin formato, por lo que cada título aparece en su propia línea.
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');
});

Todas las lecciones de Conceptos básicos de Express