Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah
  • GET /menu telah berpindah secara permanen ke /recipes.
  • GET /menu/:id telah 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('<', '&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') 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