Redirecciones
Parte de la sección Conceptos básicos de Express del Journey de Node.js de Coddy. Lección 12 de 23.
Las páginas cambian de ubicación, y los enlaces antiguos en 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 de inmediato. res.redirect establece ambos.
El estado indica cuánto tiempo 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.
Desafío
FácilLas antiguas páginas del menú se han trasladado definitivamente a las páginas de recetas, y los marcadores antiguos deberían seguir funcionando.
- En
server.js, añade una ruta para/menuque redirija a/recipescon el estado 301, que significa que se ha trasladado definitivamente. - Añade una ruta para
/menu/:idque redirija a la página de la receta con el mismo id, también con el estado 301:/menu/3lleva a/recipes/3.
Pruébalo: Pulsa «Ejecutar» y envía /menu/3. Deberías ver el estado 301 y un encabezado Location con el valor /recipes/3. Envía /menu: 301 con Location /recipes. Envía /menu/42: 301 con Location /recipes/42. La redirección no comprueba si existe la receta 42; /recipes/42 responde entonces con 404.
Pruébalo tú mismo
import { escapeHtml } from './html.js';
import express from 'express';
import { recipes } from './data.js';
const app = express();
app.use(express.static('public'));
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 una línea distinta.
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
Practica por tu cuenta: Playground de Express