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.
Sfida
FacileAggiungi 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('<', '<')
.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') 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');
});
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti di Express
3Middleware
Il tuo primo middleware