Error Middleware
Description Générale
Le fichier error.middleware.ts
contient un middleware Express utilisé pour gérer les erreurs survenues lors du traitement des requêtes. Ce middleware capture les erreurs non gérées, les enregistre dans les logs, et renvoie une réponse standardisée au client. Il garantit que l'application ne plante pas en cas d'erreur.
Fonctionnalités Principales
1. Capture des Erreurs
Le middleware intercepte toutes les erreurs survenues dans les middlewares ou contrôleurs précédents. Cela inclut les erreurs explicites (lancées avec throw
) et les erreurs inattendues.
2. Enregistrement des Erreurs
Les erreurs sont enregistrées dans les logs à l'aide du module Logger
. En mode développement, la pile d'erreurs complète est enregistrée pour faciliter le débogage.
3. Réponse Standardisée
Le middleware renvoie une réponse JSON standardisée au client, contenant :
- Un code de statut HTTP (par défaut : 500).
- Un message d'erreur générique.
Exemple de Code
Middleware errorMiddleware
import { Res } from "../types/response.entity";
import { Logger } from "../utils/logger";
/**
* Ce middleware permet de gérer les erreurs survenues lors du traitement des requêtes.
* Il sert également à ce que l'application ne plante pas en cas d'erreur.
* @category Middlewares
*/
export const errorMiddleware = async (error, req, res, next) => {
const errorMessage: string = process.env.BUILD === "dev" ? error.stack : error.message;
Logger.error(`Une erreur est survenue lors du traitement de la requête: \n${errorMessage}`, "middleware: error");
const statusCode = error.statusCode || 500;
const result = new Res(statusCode, "Une erreur est survenue lors du traitement de la requête.");
res.status(statusCode).json(result);
};
Fonctionnement
-
Capture de l'Erreur :
- Le middleware reçoit l'erreur en tant que premier paramètre (
error
). - Il peut s'agir d'une erreur explicite (par exemple,
throw new Error()
) ou d'une erreur inattendue.
- Le middleware reçoit l'erreur en tant que premier paramètre (
-
Enregistrement dans les Logs :
- En mode développement (
BUILD=dev
), la pile complète de l'erreur (error.stack
) est enregistrée. - En mode production, seul le message de l'erreur (
error.message
) est enregistré pour éviter d'exposer des informations sensibles.
- En mode développement (
-
Construction de la Réponse :
- Le middleware crée une instance de la classe
Res
pour formater la réponse. - Le code de statut HTTP est défini par
error.statusCode
(ou 500 par défaut). - Un message générique est renvoyé au client pour éviter de divulguer des détails techniques.
- Le middleware crée une instance de la classe
-
Envoi de la Réponse :
- La réponse est envoyée au client sous forme de JSON.
Exemple d'Utilisation
Intégration dans une Application Express
Le middleware doit être ajouté après tous les autres middlewares et contrôleurs pour capturer les erreurs.
Exemple :
import express from "express";
import { errorMiddleware } from "./middlewares/error.middleware";
import { authMiddleware } from "./middlewares/auth.middleware";
import { AlgosController } from "./api/algos/algos.controller";
const app = express();
const algosController = new AlgosController();
// Middlewares et routes
app.use(authMiddleware);
app.use("/algos", algosController.router);
// Middleware de gestion des erreurs
app.use(errorMiddleware);
// Démarrage du serveur
app.listen(3000, () => {
console.log("Serveur démarré sur le port 3000");
});
Points Techniques
1. Séparation des Environnements
- En mode développement (
BUILD=dev
), la pile complète de l'erreur est incluse dans les logs pour faciliter le débogage. - En mode production, seuls les messages d'erreur sont enregistrés pour éviter d'exposer des informations sensibles.
2. Standardisation des Réponses
- Le middleware utilise la classe
Res
pour formater les réponses d'erreur. Cela garantit une structure cohérente pour toutes les erreurs.
3. Prévention des Plantages
- En capturant toutes les erreurs, le middleware empêche l'application de planter en cas d'erreur inattendue.
Exemple de Flux
-
Requête Entrante :
- Une requête HTTP est envoyée à une route de l'application.
-
Erreur dans un Contrôleur ou Middleware :
- Une erreur est levée (par exemple,
throw new Error()
).
- Une erreur est levée (par exemple,
-
Capture par le Middleware :
- Le middleware
errorMiddleware
intercepte l'erreur.
- Le middleware
-
Enregistrement et Réponse :
- L'erreur est enregistrée dans les logs.
- Une réponse JSON standardisée est renvoyée au client.
Exemple de Réponse JSON
En Mode Production
{
"status": 500,
"message": "Une erreur est survenue lors du traitement de la requête."
}
En Mode Développement
{
"status": 500,
"message": "Une erreur est survenue lors du traitement de la requête.",
"stack": "Error: Exemple d'erreur\n at ..."
}