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
Intermédiaire · 9 min de lecture
Valider les entrées
Le serveur est la dernière ligne de défense
1Définition
Toute donnée reçue est suspecte : elle peut être mal formée, incomplète, absurde ou malveillante. Une route valide le corps avant de l'utiliser, répond 400 avec une raison quand il est invalide, 409 en cas de conflit, et ne recopie jamais un objet reçu tel quel dans sa base.
2Principes fondamentaux
01
Lire dans un try
request.json() lève une erreur sur un corps mal formé : sans try, le client reçoit un 500.
02
Valider en tête de route
Tous les refus d'abord ; après, le code n'a plus de doute à avoir.
03
Construire champ par champ
{ id, pseudo: donnees.pseudo } et jamais { ...donnees } : c'est la protection contre l'affectation de masse.
04
Des messages qui guident
« Le pseudo doit faire entre 2 et 20 caractères » se corrige ; « Données invalides » non.
3Exemples pratiques
Une validation complète
1let donnees;2try {3 donnees = await request.json();4} catch {5 return Response.json({ erreur: "Le corps doit être du JSON." }, { status: 400 });6}7const pseudo = typeof donnees.pseudo === "string" ? donnees.pseudo.trim() : "";8if (pseudo.length < 2 || pseudo.length > 20) {9 return Response.json({ erreur: "Le pseudo doit faire entre 2 et 20 caractères." }, { status: 400 });10}Corps illisible, type faux, longueur absurde : trois refus, trois raisons précises.
Avec une bibliothèque de schémas
1import { z } from "zod";2 3const Inscription = z.object({4 pseudo: z.string().trim().min(2).max(20),5});6 7const resultat = Inscription.safeParse(donnees);8if (!resultat.success) {9 return Response.json({ erreur: resultat.error.issues[0].message }, { status: 400 });10}Le schéma décrit la forme attendue une fois, et sert à la fois de validation, de documentation et de type TypeScript.
4Erreurs courantes
Recopier le corps
À éviter
const joueur = { id, ...donnees };À faire
const joueur = { id, pseudo: donnees.pseudo };Pourquoi : Un client ajoute "admin": true et devient administrateur : c'est l'affectation de masse.
Faire confiance au formulaire
À éviter
// le formulaire vérifie déjà la longueurÀ faire
// le serveur vérifie toujoursPourquoi : N'importe qui peut appeler l'API sans passer par le formulaire.
Répondre 500 à une donnée invalide
À éviter
const d = await request.json(); // plante sur un corps mal forméÀ faire
try { … } catch { return … 400 }Pourquoi : Un 500 dit « le serveur est cassé » ; la réalité est « ta requête l'est ».
5Subtilités à connaître
- ◆Une longueur maximale sur chaque texte est aussi une protection : sans elle, un corps de plusieurs mégaoctets occupe le serveur.
- ◆Valider les types ne suffit pas : un identifiant bien formé peut désigner la ressource de quelqu'un d'autre — c'est une question d'autorisation.
- ◆Les erreurs de validation peuvent lister tous les champs fautifs d'un coup : l'utilisateur corrige tout en une fois.
6Vérifie ta compréhension
Question 1/3
Score 0
Pseudo déjà pris :
Envie d'essayer ? Ouvre le Labo et recopie les exemples pour les modifier.