Gérer les erreurs de lecture
Objectif : Renvoyer une réponse d’erreur lorsque le fichier des commandes ne peut pas être lu.
Une lecture de fichier peut échouer : le fichier peut être absent, inaccessible ou contenir un JSON invalide. Si cette erreur n’est pas traitée, votre serveur risque de ne pas fournir de réponse utilisable à la requête. Vous allez entourer la lecture et la conversion des données d’un bloc de gestion d’erreur, puis renvoyer un statut HTTP 500 en cas de problème.
Vous avez déjà appris à traiter GET /commandes et à renvoyer les commandes en JSON. La nouveauté porte ici sur le chemin d’échec : le serveur garde une trace détaillée de l’erreur dans le terminal et renvoie au client un message générique, sans lui révéler de chemin de fichier ni de détail interne.
Entourer la lecture d’un bloc try/catch
Le bloc try contient les opérations susceptibles d’échouer. Si l’une d’elles déclenche une exception, l’exécution passe au bloc catch. Dans cet exemple, la lecture de data/commandes.json et son interprétation avec JSON.parse sont toutes deux protégées : une erreur de lecture comme une erreur de syntaxe JSON suit donc le même chemin de traitement.
Le serveur lit le fichier lorsqu’il reçoit la requête déjà prise en charge, puis renvoie les commandes lorsque les deux opérations réussissent. Le code ci-dessous est le fichier complet src/serveur.js à cet état ; il utilise les noms de fichiers du projet et conserve le calcul de démonstration avec la fonction importée.
import { createServer } from 'node:http';
import { readFile } from 'node:fs/promises';
import { calculerTotal } from './calculer-total.js';
const totalDemonstration = calculerTotal([4.5, 3.25]);
console.log(`Total de démonstration : ${totalDemonstration} €`);
const serveur = createServer(async (requete, reponse) => {
if (requete.method === 'GET' && requete.url === '/commandes') {
try {
const contenu = await readFile('data/commandes.json', 'utf8');
const commandes = JSON.parse(contenu);
reponse.writeHead(200, {
'Content-Type': 'application/json; charset=utf-8'
});
reponse.end(JSON.stringify(commandes));
} catch (erreur) {
console.error('Impossible de lire les commandes :', erreur);
reponse.writeHead(500, {
'Content-Type': 'application/json; charset=utf-8'
});
reponse.end(JSON.stringify({ erreur: 'Impossible de lire les commandes.' }));
}
return;
}
reponse.writeHead(404, {
'Content-Type': 'application/json; charset=utf-8'
});
reponse.end(JSON.stringify({ erreur: 'Route introuvable.' }));
});
serveur.listen(3000, () => {
console.log('Serveur démarré sur le port 3000');
});Au démarrage, le terminal affiche le total de démonstration puis « Serveur démarré sur le port 3000 ». Si data/commandes.json est lisible et valide, GET /commandes reçoit le tableau JSON avec le statut 200. Si la lecture ou la conversion échoue, cette requête reçoit un objet JSON d’erreur avec le statut 500.Distinguer le message serveur de la réponse client
Dans le bloc catch, console.error reçoit l’objet d’erreur complet. Le terminal peut ainsi fournir des indications utiles au diagnostic, comme le type d’échec ou le chemin concerné. La réponse HTTP, elle, ne transmet qu’un message contrôlé : elle indique que les commandes n’ont pas pu être lues, sans exposer ces détails techniques.
Le statut 500 signale une erreur interne du serveur : la requête a atteint la route attendue, mais le serveur n’a pas pu la traiter correctement à cause d’un problème côté serveur. Le statut 404 reste réservé ici aux autres méthodes ou URL. La réponse d’erreur conserve le type JSON, ce qui rend son format cohérent avec la réponse réussie de cette route.
Vérifier le chemin d’erreur
Depuis la racine du projet, démarrez le serveur avec node src/serveur.js. Pour observer la réponse 500 sans modifier le projet de façon permanente, renommez temporairement data/commandes.json, envoyez une requête à /commandes, puis remettez immédiatement le fichier à son nom d’origine. Le serveur doit rester actif et traiter la requête au lieu de s’arrêter au démarrage.
Dans le terminal du serveur, vous verrez le message de diagnostic suivi des détails de l’erreur. Le client reçoit le statut 500 et un corps comparable à {"erreur":"Impossible de lire les commandes."}. Une fois le fichier restauré, une nouvelle requête peut réussir : l’échec d’une lecture n’a pas arrêté le processus serveur.
À retenir
- Placez dans
tryles opérations susceptibles d’échouer, ici la lecture et l’analyse du JSON. - Utilisez
catchpour gérer l’échec sans interrompre le serveur. - Renvoyez le statut HTTP 500 et une réponse JSON générique lorsque les commandes ne peuvent pas être lues.
- Conservez le détail technique dans le terminal avec
console.error, sans l’exposer au client.
Dans la prochaine leçon, vous assemblerez les opérations sur les commandes et leurs calculs dans les fichiers prévus par le projet.