Leçon 14 / 15

Exposer les commandes par HTTP

20 min Node.js — premiers scripts et serveur HTTP Gratuit

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.

src/serveur.jsJavaScript
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}`);
});
Aperçu du rendu
Chargement de l'aperçu…

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.

CommandeTexte
node src/serveur.js
Résultat attendu
Le terminal affiche une ligne par commande avec son total, puis :
Serveur disponible sur http://localhost:3000

Ouvrez 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.

Structure de la réponseJSON
[
  {
    "reference": "…",
    "statut": "…",
    "montants": ["…"],
    "total": "somme calculée"
  }
]

À retenir

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.