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

Exemple
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

Exemple
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 toujours

Pourquoi : 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.