Validation des données en JavaScript (Node.js) avec Joi et Yup

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Validation des données en JavaScript (Node.js) : Joi et Yup



Dans toute application web, en particulier sur Node.js, l'une des tâches clés est la vérification des données entrantes. Sans validation, vous risquez des erreurs de base de données, des vulnérabilités (injections SQL, XSS) ou un comportement incorrect du serveur. Dans cet article, nous examinerons les deux bibliothèques de validation les plus populaires : Joi et Yup. Vous apprendrez à les installer, à créer des schémas et à les intégrer avec Express.



Pourquoi une validation côté serveur ?

La validation côté client (HTML5 ou JavaScript dans le navigateur) est pratique, mais elle est facilement contournable. Par conséquent, une vérification côté serveur est obligatoire. Elle garantit que :

  • Les types de données correspondent à ceux attendus (chaîne, nombre, tableau).
  • Les champs obligatoires ne sont pas vides.
  • Les données ne dépassent pas les tailles autorisées.
  • Les formats (email, URL, téléphone) sont corrects.


Bibliothèque Joi

Joi est un validateur puissant des créateurs de Hapi.js. Il prend en charge les schémas complexes, les messages d'erreur personnalisés et les vérifications asynchrones.



Installation

npm install joi


Exemple de schéma pour l'inscription d'un utilisateur

const Joi = require('joi');

const userSchema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required() .messages({ 'string.min': 'Le nom d\\'utilisateur doit comporter au moins 3 caractères', 'string.max': 'Le nom d\\'utilisateur ne doit pas dépasser 30 caractères' }), email: Joi.string() .email({ tlds: { allow: false } }) .required(), password: Joi.string() .pattern(new RegExp('^[a-zA-Z0-9]{8,30}$')) .required(), birth_year: Joi.number() .integer() .min(1900) .max(2024)});

// Validationapp.post('/register', (req, res) => { const { error, value } = userSchema.validate(req.body, { abortEarly: false }); if (error) { return res.status(400).json({ status: 'error', message: error.details.map(d => d.message).join(', ') }); } res.json({ status: 'success', data: value });});


Fonctionnalités avancées de Joi

  • Validation des tableaux : Joi.array().items(Joi.string())
  • Règles conditionnelles : .when('role', { is: 'admin', then: Joi.required() })
  • Fonctions personnalisées : .custom((value, helpers) => { ... })


Bibliothèque Yup

Yup est une bibliothèque légère et intuitive, populaire dans l'écosystème React (Formik). Mais elle fonctionne également très bien côté serveur.



Installation

npm install yup


Exemple de schéma pour la connexion

const yup = require('yup');

const loginSchema = yup.object().shape({ email: yup.string() .email('Veuillez saisir un email valide') .required('L\\'email est obligatoire'), password: yup.string() .min(8, 'Le mot de passe doit comporter au moins 8 caractères') .max(50) .required('Le mot de passe est obligatoire')});

// Middleware pour Expressasync function validateLogin(req, res, next) { try { const validatedData = await loginSchema.validate(req.body, { abortEarly: false }); req.validatedData = validatedData; next(); } catch (err) { res.status(400).json({ status: 'error', errors: err.errors // tableau des messages d'erreur }); }}

app.post('/login', validateLogin, (req, res) => { res.json({ status: 'success', data: req.validatedData });});


Caractéristiques de Yup

  • Validation asynchrone par défaut (retourne une Promise).
  • Transformation des données : .transform((value) => value.tr

Recommendations