Exposer les commandes par HTTP
Objectif : Servir les commandes calculées au format JSON depuis la route GET /commandes.
La route GET /commandes renvoie actuellement les commandes telles qu’elles sont enregistrées dans le fichier. Pour suivre le même objectif que le calcul affiché au démarrage, vous allez ajouter le total de chaque commande à la réponse HTTP, sans modifier les données JSON d’origine.
Vous avez déjà appris à lire et convertir ce fichier, à calculer les totaux et à traiter les erreurs de lecture. Ici, vous réutilisez ces éléments dans la route existante : elle lit les données, construit une version enrichie de chaque commande, puis la sérialise pour la réponse. Le fichier data/commandes.json reste inchangé.
Enrichir les commandes dans la route
Pour chaque commande, appelez calculerTotal avec son tableau montants. L’opérateur de décomposition ... recopie les propriétés de la commande dans un nouvel objet ; la propriété total y ajoute le résultat du calcul. Vous obtenez ainsi des données prêtes à servir, sans écraser ni réécrire le fichier source.
import { readFile, writeFile } from "node:fs/promises";
import { createServer } from "node:http";
import { calculerTotal } from "./calculer-total.js";
const port = 3000;
const contenuCommandes = await readFile("data/commandes.json", "utf8");
const commandes = JSON.parse(contenuCommandes);
for (const commande of commandes) {
console.log(`${commande.reference} : ${calculerTotal(commande.montants)}`);
}
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);
const commandesAvecTotaux = commandes.map((commande) => ({
...commande,
total: calculerTotal(commande.montants)
}));
reponse.writeHead(200, {
"Content-Type": "application/json; charset=utf-8"
});
reponse.end(JSON.stringify(commandesAvecTotaux));
} 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: "Lecture des commandes impossible" }));
}
return;
}
reponse.writeHead(404, {
"Content-Type": "application/json; charset=utf-8"
});
reponse.end(JSON.stringify({ erreur: "Route introuvable" }));
});
serveur.listen(port, () => {
console.log(`Serveur disponible sur http://localhost:${port}`);
});Le fichier est lu dans la route pour que la réponse soit construite à partir de son contenu au moment de la requête. Le bloc try protège la lecture, la conversion JSON et le calcul ; en cas d’échec, l’erreur détaillée reste dans le terminal et le client reçoit une réponse 500. Les autres URL continuent de recevoir une réponse 404.
Lancer le serveur et afficher la réponse
Depuis la racine du projet, exécutez node src/serveur.js. Le terminal affiche les références et les totaux calculés, puis indique l’adresse locale du serveur. Laissez ce processus actif pendant que vous consultez la route.
node src/serveur.jsLe terminal affiche une ligne par commande avec son total, puis :
Serveur disponible sur http://localhost:3000Ouvrez ensuite http://localhost:3000/commandes dans votre navigateur. La réponse est un tableau JSON : chaque objet conserve ses propriétés d’origine, notamment reference, statut et montants, et contient maintenant total. La valeur de ce champ correspond à la somme calculée pour cette commande ; elle n’est pas ajoutée au fichier JSON.
[
{
"reference": "…",
"statut": "…",
"montants": ["…"],
"total": "somme calculée"
}
]