Pengalihan
Termasuk bagian Dasar-Dasar Express dalam perjalanan Node.js di Coddy. Pelajaran 10 dari 20.
Halaman berpindah, dan tautan lama di bookmark serta hasil pencarian seharusnya tetap mengarah ke suatu tujuan.
app.get('/old-prices', (req, res) => {
res.redirect(301, '/prices');
});Redirect memberikan jawaban dengan status dan header Location yang menyebutkan URL baru, lalu browser langsung meminta URL tersebut. res.redirect mengatur keduanya.
Status menunjukkan berapa lama perpindahan itu berlangsung. 301 berarti berpindah selamanya: browser dan mesin pencari mengingat alamat baru dan berhenti meminta alamat lama. 302, status default saat kamu tidak memberikan status, berarti hanya sementara, jadi browser dan mesin pencari terus menggunakan URL lama.
Tantangan
MudahGET /menutelah berpindah secara permanen ke/recipes.GET /menu/:idtelah berpindah ke/recipes/:id, dengan id yang sama.
Kirim GET /menu/3, lalu baca status dan header Location. Kirim juga GET /menu/42.
Coba sendiri
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') mengirim teks biasa, sehingga setiap judul muncul pada baris tersendiri.
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');
});
Semua pelajaran di Dasar-Dasar Express
Latihan sendiri: Playground Express