Menu
CoddyTech

Il tuo primo middleware

Fa parte della sezione Fondamenti di Express del percorso Node.js di Coddy. Lezione 11 di 20.

Alcune operazioni servono per ogni richiesta, come scrivere una riga nel log, e copiarle in ogni route non finirebbe mai.

let visits = 0;

app.use((req, res, next) => {
    visits++;
    next();
});

Una funzione passata a app.use è un middleware: Express la esegue per ogni richiesta, nell'ordine in cui è stata aggiunta, prima delle route sottostanti. Riceve un terzo argomento, next. Chiamare next() passa la richiesta a ciò che viene dopo. Un middleware che non risponde né chiama next() lascia la richiesta in attesa per sempre.

Anche express.static del capitolo precedente è un middleware: risponde quando trova un file e chiama next() quando non lo trova.

challenge icon

Sfida

Facile

Aggiungi un middleware che stampa il metodo e il percorso di ogni richiesta, come GET /recipes/2.

Invia GET /recipes/2 e GET /nope, poi leggi la Console.

Provalo tu

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') invia testo semplice, quindi ogni titolo appare su una riga a sé.
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.get('/menu', (req, res) => {
    res.redirect(301, '/recipes');
});

app.get('/menu/:id', (req, res) => {
    res.redirect(301, `/recipes/${req.params.id}`);
});

app.listen(3000, () => {
    console.log('Recipe Box is running on port 3000');
});
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti di Express