Leçon 10 / 15

Valider le corps d’une création de commande

25 min Node.js — API Express et code asynchrone Gratuit

Objectif : Refuser une création de commande lorsque ses champs requis ou leurs types sont invalides.

Une route de création ne doit pas transmettre au service des données absentes ou mal formées. Sans contrôle, le traitement métier peut échouer de façon imprévisible ou enregistrer une commande inutilisable. Vous allez placer une validation explicite avant le contrôleur, tout en conservant le format d’erreur déjà établi.

La leçon précédente a mis en place le middleware central qui convertit les erreurs transmises à Express en réponses JSON normalisées. Ici, vous ajoutez un middleware spécialisé pour le corps de POST /api/commandes : il laisse passer les données conformes et appelle next avec une erreur dans le cas contraire.

Définir les champs acceptés

Pour cette première création, le corps doit être un objet JSON qui contient produitId et quantite. Les deux valeurs doivent être des nombres entiers strictement positifs ; vous refusez également un corps absent, un tableau ou une valeur qui n’est pas un objet. Ces règles sont volontairement simples et seront complétées par les validations prévues dans les leçons suivantes.

Créer le middleware de validation

Dans middlewares/valider.js, exportez une fonction qui inspecte req.body. Si une règle échoue, elle transmet un objet d’erreur doté d’un statut et d’un code ; le middleware central sait déjà le transformer en réponse. Sinon, l’appel à next() poursuit la chaîne vers le contrôleur.

middlewares/valider.jsJavaScript
function validerCommande(req, res, next) {
  const corps = req.body;
  const valide =
    corps !== null &&
    typeof corps === 'object' &&
    !Array.isArray(corps) &&
    Number.isInteger(corps.produitId) &&
    corps.produitId > 0 &&
    Number.isInteger(corps.quantite) &&
    corps.quantite > 0;

  if (!valide) {
    const erreur = new Error(
      'produitId et quantite doivent être des entiers positifs'
    );
    erreur.status = 400;
    erreur.code = 'VALIDATION';
    return next(erreur);
  }

  return next();
}

module.exports = { validerCommande };
Aperçu du rendu
Chargement de l'aperçu…

Le contrôle combine les vérifications avant d’accéder aux propriétés : un corps nul, un tableau ou une primitive ne peut donc pas être traité comme une commande. Number.isInteger écarte notamment les chaînes telles que "2" et les nombres décimaux. Le statut 400 et le code VALIDATION décrivent l’entrée incorrecte ; le gestionnaire central fournit le format JSON commun.

Placer la validation avant le contrôleur

Modifiez routes/commandes.js pour associer le middleware uniquement à la route de création. La liste des commandes et son contrôleur asynchrone restent inchangés. L’adaptateur déjà présent continue de transmettre au middleware central les éventuels rejets asynchrones du contrôleur.

routes/commandes.jsJavaScript
const express = require('express');
const commandesControleur = require('../controleurs/commandes');
const { validerCommande } = require('../middlewares/valider');

const routeur = express.Router();

const executerAsync = (controleur) => (req, res, next) =>
  Promise.resolve(controleur(req, res, next)).catch(next);

routeur.get('/', executerAsync(commandesControleur.lister));
routeur.post(
  '/',
  validerCommande,
  executerAsync(commandesControleur.creer)
);

module.exports = routeur;
Aperçu du rendu
Chargement de l'aperçu…

La route montre l’ordre d’exécution : Express appelle d’abord validerCommande, puis le contrôleur creer seulement si le middleware appelle next() sans erreur. Si la validation échoue, next(erreur) saute les traitements normaux et atteint le gestionnaire central placé à la fin de serveur.js. Aucun try/catch n’est ajouté à la route.

Observer les deux parcours

Avec un corps valide, par exemple {"produitId":2,"quantite":3}, la validation laisse la requête atteindre le contrôleur. Celui-ci peut alors appeler le service et retourner sa réponse de succès selon le comportement de création établi dans votre projet. La validation ne construit pas elle-même la commande et ne remplace pas la logique métier du service.

Avec {"produitId":"2","quantite":3}, la valeur de produitId est une chaîne et non un entier : le contrôleur n’est pas appelé. Le middleware central renvoie une erreur HTTP 400 dans le format convenu. Comme le texte de l’erreur vient du middleware, sa réponse reste cohérente avec les autres erreurs sans répéter le code de sérialisation.

À retenir

  • Définissez les règles du corps attendu avant d’appeler le contrôleur.
  • Placez le middleware de validation avant le contrôleur sur la route concernée.
  • Transmettez les erreurs à Express avec next pour conserver la réponse normalisée centrale.
  • Un corps valide poursuit le traitement ; un corps invalide s’arrête avec une réponse 400.

Dans la leçon suivante, vous validerez les identifiants des paramètres de route et distinguerez un identifiant invalide d’une ressource absente.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.