Back-end · 5 mondes · 15 étapes

API avec Node

Construire une API qui répond juste, valide ce qu'elle reçoit et se protège.

Progression

0 %

0/15 étapes terminées

Avancé · 12 min de lecture

Une API en production

Base de données, journaux, versions et documentation

1Définition

Une API de production ajoute quatre exigences à ce cours : des données persistantes (une vraie base, pas une Map), des journaux pour comprendre ce qui s'est passé, une stratégie de versions pour évoluer sans casser les clients, et une documentation que les développeurs peuvent suivre.

2Principes fondamentaux

01

La base de données remplace la Map

Les mêmes routes, mais await db.query(…) à la place de badges.get(id) — avec des requêtes paramétrées, jamais concaténées.

02

Journaliser sans exposer

On note la méthode, le chemin, le statut et la durée ; jamais un mot de passe ni un jeton complet.

03

Versionner

/v1/joueurs puis /v2/joueurs : une application installée il y a un an doit continuer de fonctionner.

04

Documenter le contrat

Un schéma OpenAPI décrit chaque route, ses paramètres et ses réponses ; des outils en tirent une documentation interactive.

3Exemples pratiques

Un middleware de journal

Exemple
1const avecJournal = (route) => async (request) => {2  const debut = Date.now();3  const reponse = await route(request);4  const url = new URL(request.url);5  console.log(`${request.method} ${url.pathname} ${reponse.status} ${Date.now() - debut}ms`);6  return reponse;7};

Une ligne par requête : de quoi retrouver, des semaines plus tard, pourquoi un joueur a reçu une erreur.

La même route, sur une vraie base

Exemple
1"GET /joueurs/:id": async (request, id) => {2  const joueur = await db.query("SELECT id, pseudo FROM joueurs WHERE id = $1", [id]);3  return joueur ? Response.json(joueur) : introuvable();4}

La logique HTTP ne change pas ; seule la source des données change. C'est ce qu'apporte une route bien découpée.

4Erreurs courantes

Journaliser les secrets

À éviter

console.log(request.headers)

À faire

console.log(method, chemin, statut, duree)

Pourquoi : Les journaux sont lus par beaucoup de monde et conservés longtemps : un jeton qui y figure est un jeton volé.

Casser un contrat existant

À éviter

renommer `pseudo` en `nom` dans /joueurs

À faire

ajouter `nom`, garder `pseudo`, ou publier /v2

Pourquoi : Les applications déjà installées lisent pseudo : elles cassent le jour du déploiement.

5Subtilités à connaître

  • ◆Une réponse lente coûte plus qu'une erreur : un délai d'expiration côté serveur évite qu'une requête bloquée n'immobilise les autres.
  • ◆Les codes 5xx se surveillent : une alerte au-delà d'un certain taux prévient avant que les utilisateurs ne se plaignent.
  • ◆Le cache HTTP (Cache-Control) peut éviter des milliers de requêtes identiques sur les données qui changent peu.

6Techniques d'expert

Une forme d'erreur standard

Le format « Problem Details » (RFC 9457) normalise les erreurs : un type, un titre, un statut, un détail.

return Response.json(  { type: "about:blank", title: "Pseudo déjà pris", status: 409, detail: "codey existe déjà." },  { status: 409, headers: { "Content-Type": "application/problem+json" } },);

Tester une route sans serveur

Une route au standard Request / Response se teste en l'appelant directement, exactement comme le font les exercices de ce cours.

const reponse = await handler(new Request("http://test/ping"));expect(reponse.status).toBe(200);expect(await reponse.text()).toBe("pong");

Idempotence des paiements

Un en-tête Idempotency-Key permet au serveur de reconnaître un POST rejoué (double clic, réseau instable) et de ne pas l'exécuter deux fois.

7Sur le terrain

  • Le backend prévu pour Sys-Code exposera exactement ces routes — profil, progression, porte-monnaie — protégées par jeton et adossées à PostgreSQL.
  • Next.js écrit ses routes d'API au standard Request / Response : le code de ce cours s'y colle presque tel quel.
  • La majorité des fuites de données d'API viennent d'un contrôle d'appartenance oublié, pas d'un chiffrement cassé.

8Vérifie ta compréhension

Question 1/3

Score 0

Qu'est-ce qu'on ne journalise jamais ?

Envie d'essayer ? Ouvre le Labo et recopie les exemples pour les modifier.