Votre premier middleware
Fait partie de la section Les bases d’Express du Journey Node.js de Coddy. Leçon 11 sur 20.
Certaines tâches concernent chaque requête, comme écrire une ligne dans le journal, et les copier dans chaque route n’en finirait jamais.
let visits = 0;
app.use((req, res, next) => {
visits++;
next();
});Une fonction passée à app.use est un middleware : Express l’exécute pour chaque requête, dans l’ordre où elle a été ajoutée, avant les routes qui la suivent. Elle reçoit un troisième argument, next. Appeler next() transmet la requête à l’élément suivant. Un middleware qui ne répond pas et n’appelle pas next() laisse la requête en attente indéfiniment.
express.static, présenté dans le chapitre précédent, est aussi un middleware : il répond lorsqu’il trouve un fichier et appelle next() lorsqu’il n’en trouve pas.
Défi
FacileAjoute un middleware qui affiche la méthode et le chemin de chaque requête, comme GET /recipes/2.
Envoie GET /recipes/2 et GET /nope, puis consulte la console.
Essayez vous-même
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') envoie du texte brut, donc chaque titre apparaît sur sa propre ligne.
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');
});
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Les bases d’Express
1Votre premier serveur
Bonjour, ExpressLe module httpPlus de routesParamètres de route3Middleware
Votre premier middleware