Kodokon kodokon.com

Votre premier serveur HTTP natif

Vous créez un serveur web avec le module http de Node, répondez aux requêtes et renvoyez du JSON.

10 min · 3 questions

Ouvrir cette leçon dans Kodokon

Un serveur web est un programme qui tourne en continu et attend des requêtes : des demandes envoyées par un client (navigateur, application mobile...). À chaque requête, il renvoie une réponse. Ce dialogue suit le protocole HTTP, le langage commun du web. Node inclut un module http prêt à l'emploi : rien à installer. Dernière notion : le port, un numéro qui identifie un programme précis sur une machine, comme un numéro d'appartement dans un immeuble. Nous utiliserons le port 3000 ; quant à localhost, il désigne simplement votre propre machine.

JAVASCRIPT
import http from "node:http";

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.end("Bonjour depuis mon serveur !");
});

server.listen(3000, () => {
  console.log("Serveur sur http://localhost:3000");
});
Enregistrez ce code dans server.js puis lancez node server.js.

Décortiquons. http.createServer reçoit une fonction appelée à chaque requête, avec deux paramètres : req (la requête reçue) et res (la réponse en cours de construction). res.statusCode = 200 pose le code de statut - 200 signifie « tout va bien ». res.setHeader ajoute un en-tête (header), une métadonnée de la réponse : ici son format, du texte brut. res.end envoie la réponse et la clôt. Enfin, server.listen(3000) met le serveur à l'écoute du port 3000. Ouvrez http://localhost:3000 dans votre navigateur : votre texte s'affiche. Remarquez que le programme ne rend pas la main : il attend les requêtes. Arrêtez-le avec Ctrl+C.

Les serveurs modernes renvoient rarement du texte brut : ils exposent des API qui répondent en JSON, ce format texte que vous connaissez déjà, compris par tous les langages. Deux ajustements : l'en-tête Content-Type devient application/json, et l'objet JavaScript est converti en texte avec JSON.stringify. Profitons-en pour réagir différemment selon req.url, le chemin demandé par le client : c'est la base du routage.

JAVASCRIPT
import http from "node:http";

const server = http.createServer((req, res) => {
  res.setHeader("Content-Type", "application/json");

  if (req.url === "/api/message") {
    const body = { message: "Bonjour !", ok: true };
    res.statusCode = 200;
    res.end(JSON.stringify(body));
    return;
  }

  res.statusCode = 404;
  res.end(JSON.stringify({ error: "Introuvable" }));
});

server.listen(3000, () => {
  console.log("http://localhost:3000/api/message");
});
Une route connue répond 200 avec un objet JSON ; tout autre chemin reçoit un 404.

Le code de statut 404 signifie « introuvable » : le chemin demandé ne correspond à aucune route connue. Notez le return après la première réponse : il empêche le code de continuer et d'envoyer une seconde réponse, ce qui provoquerait une erreur. Pour tester, ouvrez l'adresse dans le navigateur, ou utilisez curl, un outil en ligne de commande qui envoie des requêtes HTTP et affiche la réponse dans le terminal.

BASH
curl http://localhost:3000/api/message
Dans un second terminal, pendant que le serveur tourne : la réponse JSON s'affiche.

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Que fait server.listen(3000) ?
    • Il met le serveur à l'écoute des requêtes sur le port 3000
    • Il envoie une requête vers le port 3000
    • Il limite le serveur à 3000 requêtes simultanées
    • Il ouvre le navigateur sur localhost:3000
  2. Quel en-tête envoyer pour indiquer que la réponse est du JSON ?
    • Accept: application/json
    • Content-Type: application/json
    • Format: json
  3. Pourquoi passer l'objet par JSON.stringify avant res.end ?
    • Pour compresser la réponse et gagner du temps
    • Pour vérifier que l'objet ne contient pas d'erreur
    • Parce qu'une réponse HTTP transporte du texte, pas un objet JavaScript