đ SAISON B Semaine 2 Ăpisode 3 - Les Middlewares avec Express
đ Notions du jour
Aujourdâhui, jâai dĂ©couvert un concept central dans Express : les middlewares. Un middleware, câest comme un ouvrier sur une chaĂźne de montage : il reçoit une requĂȘte, fait un travail spĂ©cifique (comme valider des donnĂ©es, logger une information, ou modifier la requĂȘte/rĂ©ponse), puis passe le relais au middleware suivant. Express est dâailleurs conçu comme un moteur de middlewares : tout y est middleware, des routes aux gestionnaires dâerreurs ! C'est ce qu'on appel un design pattern.
Nous utilisions déjà sans le savoir des middlewares lors de notre apprentissage d'Express.
Pourquoi câest puissant ?
- Modularité : Chaque middleware a une responsabilité unique.
- RĂ©utilisabilitĂ© : Un middleware peut ĂȘtre utilisĂ© sur plusieurs routes.
- Flexibilité : Vous pouvez ajouter, retirer ou réorganiser des middlewares sans tout casser.
đ Comment Fonctionnent les Middlewares ?
Un middleware est une fonction qui prend 3 paramĂštres :
req: Lâobjet requĂȘte (informations sur la requĂȘte HTTP).res: Lâobjet rĂ©ponse (pour envoyer une rĂ©ponse au client).next: Une fonction callback pour passer au middleware suivant.
Syntaxe de base :
function myMiddleware(req, res, next) {
// Something to do with req and/or res here
console.log("Middleware executed!");
next(); // Go to the next middleware
}
đ Deux Façons dâUtiliser les Middlewares
1ïžâŁ Middleware SpĂ©cifique Ă une Route (app.get, app.post, etc.)
Le middleware ne sâexĂ©cute que si lâURL correspond Ă la route.
Exemple :
app.get('/about', (req, res, next) => {
console.log("Someone accessed the About page!");
next();
}, (req, res) => {
res.send("About Page");
});
Explications :
- Le premier argument de
app.getest un middleware qui logge lâaccĂšs Ă/about. - Le deuxiĂšme argument est la fonction qui envoie la rĂ©ponse.
2ïžâŁ Middleware Global (app.use)
Le middleware sâexĂ©cute pour toutes les requĂȘtes, peu importe lâURL.
Exemple :
// Middleware that logs all request
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next();
});
Cas dâusage :
- Logging (journalisation des requĂȘtes).
- Authentification (vĂ©rifier si lâutilisateur est connectĂ©).
âïž LâOrdre des Middlewares : Une Question Cruciale
Lâordre dans lequel on chaĂźne les middlewares est essentiel ! Express exĂ©cute les middlewares dans lâordre oĂč ils sont dĂ©clarĂ©s. Si un middleware nâappelle pas next(), la chaĂźne sâarrĂȘte.
Exemple :
// Middleware 1 : Logs the request
app.use((req, res, next) => {
console.log("Middleware 1");
next();
});
// Finale route
app.get('/', (req, res) => {
res.send("Welcome!");
});
đ ïž Exemples Concrets de Middlewares
1ïžâŁ Middleware de Logging
Objectif : Logger toutes les requĂȘtes (mĂ©thode, URL, heure).
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next();
});
2ïžâŁ Middleware pour Servir des Fichiers Statiques
Objectif : Servir les fichiers CSS, JS et images depuis un dossier public/.
đĄ Ce Que Jâai Appris Aujourdâhui
- Tout est middleware dans Express : Les routes, les gestionnaires dâerreurs, mĂȘme
express.static. - Lâordre des middlewares est crucial : Un middleware qui nâappelle pas
next()bloque la chaĂźne. - Les middlewares permettent de :
- Logger les requĂȘtes.
- Valider les données (authentification, validation de formulaires).
- Modifier les requĂȘtes/rĂ©ponses.
- Gérer les erreurs de maniÚre centralisée.
app.use()vsapp.get():app.use(): Middleware global (toutes les requĂȘtes).app.get(): Middleware spĂ©cifique Ă une route/mĂ©thode.
âšïž Challenge du jour : Challenge Middlewares pour la GhibliothĂšque â Gestion des 404 et Journalisation des Visites
đ€ PrĂ©sentation du Challenge
Aujourdâhui, nous allons amĂ©liorer notre GhibliothĂšque en ajoutant deux middlewares essentiels :
- Une gestion personnalisĂ©e des erreurs 404 pour afficher une page "not found" stylisĂ©e quand une route nâexiste pas.
- Un systÚme de journalisation (logging) pour tracer les visites (date, IP, chemin accédé).
Lâobjectif Ă©tait de comprendre le fonctionnement des middlewares dans Express et de les utiliser pour amĂ©liorer lâexpĂ©rience utilisateur et le dĂ©bogage.
đ Ătapes Ă RĂ©aliser
1ïžâŁ Gestion des 404 PersonnalisĂ©e
Objectif : Afficher une page 404 personnalisĂ©e quand une route nâest pas trouvĂ©e.
đšâđ» Solution proposĂ©e
Jâai dâabord eu du mal Ă comprendre comment capturer les erreurs 404 sans consulter la documentation (comme demandĂ© dans lâĂ©noncĂ©). AprĂšs quelques essais, jâai trouvĂ© une solution qui fonctionne, mais je ne suis pas sĂ»r quâelle soit optimale. Je me suis dit que je pouvais crĂ©er un Middleware qui renvoie une erreur 404 par dĂ©faut si aucune route n'est trouvĂ©e. PlacĂ© aprĂšs le Middleware qui qui gĂšre les routes app.use(router);, si aucune route n'est trouvĂ©e quand l'utilisateur essaie d'accĂ©der Ă une url qui n'existe pas, cela renvoie un statut 404 et rend la page personalisĂ©e 404 existante.
Mon code :
Réflexions aprÚs avoir lu la documentation :
AprĂšs avoir vĂ©rifiĂ© la documentation, il s'avĂšre que cette solution Ă©tait la bonne đ
. Je cherchais à forcément capturer une erreur afin de la renvoyer. Alors que la documentation précise que ce n'est pas nécessaire : how to handle 404 responses.
đ In Express, 404 responses are not the result of an error, so the error-handler middleware will not capture them. This behavior is because a 404 response simply indicates the absence of additional work to do; in other words, Express has executed all middleware functions and routes, and found that none of them responded. All you need to do is add a middleware function at the very bottom of the stack (below all other functions) to handle a 404 response.
2ïžâŁ Journalisation des Visites
Objectif : Logger (journaliser) chaque requĂȘte avec :
- La date de la requĂȘte.
- Lâadresse IP du visiteur.
- Le chemin accédé (ex:
/movies/1).
đšâđ» Solution proposĂ©e
Jâai explorĂ© lâobjet req pour trouver les informations nĂ©cessaires. Voici comment jâai implĂ©mentĂ© le middleware de logging :
Mon code :
export function requestLogging(req, res, next) {
const timestamp = new Date().toISOString();
const ipAddress = req.ip;
const url = req.url;
console.log(`${timestamp} ${ipAddress} ${url}`);
next();
}
Import du middleware de logging dans index.js :
3ïžâŁ Bonus : Formatage ĂlĂ©gant des Logs
Objectif : AmĂ©liorer le format des logs pour quâils soient plus lisibles et exploitables.
đšâđ» Solution proposĂ©e
Jâai ajustĂ© le format des logs pour quâils suivent le format demandĂ© : [date-iso ip] path.
Mon code mis à jour : (Insérer ici ton bloc de code pour le formatage élégant des logs. Par exemple :)
export function requestLogging(req, res, next) {
const timestamp = new Date().toISOString();
const ipAddress = req.ip;
const url = req.url;
console.log(`[${timestamp} ${ipAddress}] ${url}`);
next();
}
đĄ Ce Que Jâai Appris avec ce Challenge
- Les middlewares sont le cĆur dâExpress : Ils permettent dâajouter des fonctionnalitĂ©s (logging, authentification, etc.) de maniĂšre modulaire.
- Lâordre des middlewares est crucial :
- Le middleware de logging doit ĂȘtre placĂ© avant les routes pour capturer toutes les requĂȘtes.
- Le middleware 404 doit ĂȘtre placĂ© aprĂšs toutes les routes pour ĂȘtre exĂ©cutĂ© en dernier recours.
- Lâobjet
reqcontient Ă©normĂ©ment informations utiles : req.ip: Adresse IP du visiteur.req.url: URL de la requĂȘte.req.method: MĂ©thode HTTP (GET, POST, etc.).- Le formatage des logs est important :
- Un format clair (
[date ip] path) permet de filtrer et analyser les logs facilement.