Validando la entrada en Express usando express-validator

Aprenda a validar cualquier dato que ingrese como entrada en sus terminales Express

Supongamos que tiene un punto final POST que acepta los parámetros de nombre, correo electrónico y edad:

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 })

¿Cómo se realiza la validación del lado del servidor en esos resultados para asegurarse de que:

  • el nombre es una cadena de al menos 3 caracteres?
  • el correo electrónico es un correo electrónico real?
  • la edad es un número, entre 0 y 110?

La mejor manera de manejar la validación en cualquier tipo de entrada proveniente del exterior en Express es usando elexpress-validatorpaquete:

npm install express-validator

Necesitas elcheckyvalidationResultobjetos del paquete:

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

Pasamos una matriz decheck()llamadas como segundo argumento de lapost()llamada. Cadacheck()call acepta el nombre del parámetro como argumento. Entonces llamamosvalidationResult()para verificar que no hubo errores de validación. Si las hay, se las decimos al cliente:

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 })

Fíjate que usé

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

Hay muchos más de estos métodos, todos provenientes devalidator.js, incluyendo:

  • contains(), compruebe si el valor contiene el valor especificado
  • equals(), compruebe si el valor es igual al valor especificado
  • isAlpha()
  • isAlphanumeric()
  • isAscii()
  • isBase64()
  • isBoolean()
  • isCurrency()
  • isDecimal()
  • isEmpty()
  • isFQDN(), ¿es un nombre de dominio completo?
  • isFloat()
  • isHash()
  • isHexColor()
  • isIP()
  • isIn(), compruebe si el valor está en una matriz de valores permitidos
  • isInt()
  • isJSON()
  • isLatLong()
  • isLength()
  • isLowercase()
  • isMobilePhone()
  • isNumeric()
  • isPostalCode()
  • isURL()
  • isUppercase()
  • isWhitelisted(), compara la entrada con una lista blanca de caracteres permitidos

Puede validar la entrada con una expresión regular usandomatches().

Las fechas se pueden verificar usando

  • isAfter(), verifique si la fecha ingresada es posterior a la que pasa
  • isBefore(), verifique si la fecha ingresada es anterior a la que pasa
  • isISO8601()
  • isRFC3339()

Para obtener detalles exactos sobre cómo utilizar esos validadores, consultehttps://github.com/chriso/validator.js#validators.

Todos esos controles se pueden combinar canalizándolos:

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

Si hay algún error, el servidor envía automáticamente una respuesta para comunicar el error. Por ejemplo, si el correo electrónico no es válido, esto es lo que se devolverá:

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

Este error predeterminado se puede anular para cada verificación que realice, utilizandowithMessage():

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

¿Qué sucede si desea escribir su propio validador especial y personalizado? Puedes usar elcustomvalidador.

En la función de devolución de llamada, puede rechazar la validación lanzando una excepción o devolviendo una promesa rechazada:

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
})

El validador personalizado:

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

se puede reescribir como

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

Descarga mi gratisManual de Express.js


Más tutoriales rápidos: