Votre premier serveur HTTP
createServer, requête, réponse et listen.
Objectifs
À la fin de cette leçon, vous saurez :
- créer un serveur avec node:http ;
- lire la requête entrante (méthode, URL, en-têtes) ;
- écrire une réponse complète et fermer proprement.
🔗 Pour vous rafraîchir la mémoire : en-têtes HTTP et JSON
Douze lignes pour servir le monde
import { createServer } from "node:http";
const serveur = createServer(function (requete, reponse) {
console.log(requete.method, requete.url);
reponse.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
reponse.end("Bonjour depuis Node !");
});
serveur.listen(3000, () => {
console.log("En écoute sur http://localhost:3000");
});
Testez : node serveur.js puis visitez http://localhost:3000 — ou mieux, avec curl -v localhost:3000 pour voir l'échange complet du chapitre HTTP.
Le callback : une fonction par requête
Chaque requête entrante déclenche votre fonction avec deux objets :
requete (IncomingMessage) reponse (ServerResponse)
├── method "GET" ├── writeHead(statut, en-têtes)
├── url "/users/42" ├── setHeader(...)
├── headers {...} └── end(corps) ← OBLIGATOIRE
└── body → à collecter soi-même
Règle absolue : chaque requête doit recevoir exactement un end(). Oublié = le navigateur tourne indéfiniment ; appelé deux fois = crash.
Répondre en JSON
reponse.writeHead(200, { "Content-Type": "application/json" });
reponse.end(JSON.stringify({ ok: true, message: "Bonjour" }));
Le couple Content-Type + JSON.stringify est le contrat que consommera votre frontend au chapitre full-stack.
Ce qui se passe sous le capot
navigateur
↓ TCP vers port 3000 (chapitre 9)
socket acceptée par Node
↓ octets parsés selon HTTP (chapitre 11)
votre callback est invoqué
↓
vos octets repartent sur la même socket
Aucune magie de framework : Node fait le parsing bas niveau et vous remet les objets propres. Tout ce que fera Express ou NestJS plus tard se branche exactement ici.
Exercice
- Lancez ce serveur ; interrogez-le avec curl -v. Identifiez chaque partie de la réponse.
- Faites répondre
/heurepar l'heure courante (new Date().toLocaleTimeString()). - Ajoutez un log des User-Agent (
requete.headers["user-agent"]). - Que se passe-t-il si vous commentez le
end()? Vérifiez avec curl (Ctrl+C pour sortir).
Résumé
- createServer(callback) + listen(port) = serveur complet.
- callback(requete, reponse) par requête ; end() obligatoire.
- writeHead + JSON.stringify = API JSON primitive mais réelle.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 4. La connexion reste ouverte : curl attend indéfiniment des octets qui ne viennent jamais. C'est le contrat HTTP — la réponse se termine quand le serveur décide de la terminer.