Validation de l'entrée dans Express à l'aide du validateur express

Apprenez à valider les données entrant en tant qu'entrée dans vos points de terminaison Express

Supposons que vous ayez un point de terminaison POST qui accepte le nom, l'adresse e-mail et les paramètres d'âge:

const express = require('express')
const app = express()

app.use(express.json())

app.post(’/form’, (req, res) => { const name = req.body.name const email = req.body.email const age = req.body.age })

Comment effectuez-vous la validation côté serveur de ces résultats pour vous assurer:

  • nom est une chaîne d'au moins 3 caractères?
  • l'email est un vrai email?
  • l'âge est un nombre, entre 0 et 110?

La meilleure façon de gérer la validation sur tout type d'entrée provenant de l'extérieur dans Express est d'utiliser leexpress-validatorpaquet:

npm install express-validator

Vous avez besoin duchecketvalidationResultobjets du package:

const { check, validationResult } = require('express-validator');

Nous passons un tableau decheck()appelle comme deuxième argument dupost()appeler. Chaquecheck()call accepte le nom du paramètre comme argument. Puis nous appelonsvalidationResult()pour vérifier qu'il n'y a pas eu d'erreurs de validation. S'il y en a, nous leur disons au client:

app.post('/form', [
  check('name').isLength({ min: 3 }),
  check('email').isEmail(),
  check('age').isNumeric()
], (req, res) => {
  const errors = validationResult(req)
  if (!errors.isEmpty()) {
    return res.status(422).json({ errors: errors.array() })
  }

const name = req.body.name const email = req.body.email const age = req.body.age })

Remarquez que j'ai utilisé

  • isLength()
  • isEmail()
  • isNumeric()

Il existe de nombreuses autres méthodes, toutes issues devalidator.js, y compris:

  • contains(), vérifiez si la valeur contient la valeur spécifiée
  • equals(), vérifiez si la valeur est égale à la valeur spécifiée
  • isAlpha()
  • isAlphanumeric()
  • isAscii()
  • isBase64()
  • isBoolean()
  • isCurrency()
  • isDecimal()
  • isEmpty()
  • isFQDN(), est un nom de domaine pleinement qualifié?
  • isFloat()
  • isHash()
  • isHexColor()
  • isIP()
  • isIn(), vérifiez si la valeur est dans un tableau de valeurs autorisées
  • isInt()
  • isJSON()
  • isLatLong()
  • isLength()
  • isLowercase()
  • isMobilePhone()
  • isNumeric()
  • isPostalCode()
  • isURL()
  • isUppercase()
  • isWhitelisted(), vérifie l'entrée par rapport à une liste blanche de caractères autorisés

Vous pouvez valider l'entrée par rapport à une expression régulière en utilisantmatches().

Les dates peuvent être vérifiées en utilisant

  • isAfter(), vérifiez si la date saisie est postérieure à celle que vous passez
  • isBefore(), vérifiez si la date saisie est antérieure à celle que vous passez
  • isISO8601()
  • isRFC3339()

Pour plus de détails sur l'utilisation de ces validateurs, reportez-vous àhttps://github.com/chriso/validator.js#validators.

Tous ces contrôles peuvent être combinés en les canalisant:

check('name')
  .isAlpha()
  .isLength({ min: 10 })

En cas d'erreur, le serveur envoie automatiquement une réponse pour communiquer l'erreur. Par exemple si l'email n'est pas valide, voici ce qui sera retourné:

{
  "errors": [{
    "location": "body",
    "msg": "Invalid value",
    "param": "email"
  }]
}

Cette erreur par défaut peut être remplacée pour chaque contrôle que vous effectuez, en utilisantwithMessage():

check('name')
  .isAlpha()
  .withMessage('Must be only alphabetical chars')
  .isLength({ min: 10 })
  .withMessage('Must be at least 10 chars long')

Et si vous voulez écrire votre propre validateur spécial et personnalisé? Vous pouvez utiliser lecustomvalidateur.

Dans la fonction de rappel, vous pouvez rejeter la validation soit en lançant une exception, soit en renvoyant une promesse rejetée:

app.post('/form', [
  check('name').isLength({ min: 3 }),
  check('email').custom(email => {
    if (alreadyHaveEmail(email)) {
      throw new Error('Email already registered')
    }
  }),
  check('age').isNumeric()
], (req, res) => {
  const name  = req.body.name
  const email = req.body.email
  const age   = req.body.age
})

Le validateur personnalisé:

check('email').custom(email => {
  if (alreadyHaveEmail(email)) {
    throw new Error('Email already registered')
  }
})

peut être réécrit comme

check('email').custom(email => {
  if (alreadyHaveEmail(email)) {
    return Promise.reject('Email already registered')
  }
})

Téléchargez mon gratuitManuel Express.js


Plus de tutoriels express: