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
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
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 /v2Pourquoi : 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.