Joi es una librería de Javascript que te ayuda a definir esquemas para validar entradas contra estos esquemas (objetos js).

Instalación

npm i joi

Ahora vamos a crear un archivo llamado validator.js en el que escribiremos nuestras reglas y las importaremos en los archivos de rutas. Y solo aquellas solicitudes que tengan entradas (inputs) validos se pasarán al controlador.

const joi = require('joi');

module.exports = {

  schemas : {
    userSchema : Joi.object().keys({
      email : Joi.string().email().required(),
      password : Joi.string().required()
    }),
  },

  validateBody : (schema) => {
    return (req, res, next) => {
      const result = Joi.validate(req.body, schema);
      if( result.error ) {
        return res.status(400).json({
          message : result.error.details
        })
      }else {
        if(!req.value) {
          req.value = {}
        }
        req.value['body'] = result.value;
        next();
      }
    }
  }  
}

El objeto Schema contiene la definición de todos los esquemas, como userSchema, actorSchema, directorSchema o más. Aquí establecemos las reglas para cada valor de clave. Luego, estamos pasando este esquema a una función validateBody que validará la solicitud contra el esquema definido llamando. En caso de errores enviará un mensaje de error en respuesta mientras que en caso de éxito pasará el control al controlador, aquí tenemos un archivo de rutas donde estamos importando estas funciones y esquema y pasándolas como un validador en ruta. Joi.validate(req.body, schema)

Routes

En el archivo de la ruta tendrás que importar el middleware de validación

const userController = require('../controllers/userController');
const {
  validateBody,
  schemas
} = '../helpers/validator';

router.post('/signUp', validateBody(schemas.userSchema), userController.signUp);

Validación con Sequelize

Si deseas validar los modelos con Sequelize no es necesario usar Joi, usa Joi se necesitas mostrar mensajes personalizados de validación.

sequelize.define('foo', {
  bar: {
    type: DataTypes.STRING,
    validate: {
      is: /^[a-z]+$/i,          // matches this RegExp
      is: ["^[a-z]+$",'i'],     // same as above, but constructing the RegExp from a string
      not: /^[a-z]+$/i,         // does not match this RegExp
      not: ["^[a-z]+$",'i'],    // same as above, but constructing the RegExp from a string
      isEmail: true,            // checks for email format ([email protected])
      isUrl: true,              // checks for url format (<http://foo.com>)
      isIP: true,               // checks for IPv4 (129.89.23.1) or IPv6 format
      isIPv4: true,             // checks for IPv4 (129.89.23.1)
      isIPv6: true,             // checks for IPv6 format
      isAlpha: true,            // will only allow letters
      isAlphanumeric: true,     // will only allow alphanumeric characters, so "_abc" will fail
      isNumeric: true,          // will only allow numbers
      isInt: true,              // checks for valid integers
      isFloat: true,            // checks for valid floating point numbers
      isDecimal: true,          // checks for any numbers
      isLowercase: true,        // checks for lowercase
      isUppercase: true,        // checks for uppercase
      notNull: true,            // won't allow null
      isNull: true,             // only allows null
      notEmpty: true,           // don't allow empty strings
      equals: 'specific value', // only allow a specific value
      contains: 'foo',          // force specific substrings
      notIn: [['foo', 'bar']],  // check the value is not one of these
      isIn: [['foo', 'bar']],   // check the value is one of these
      notContains: 'bar',       // don't allow specific substrings
      len: [2,10],              // only allow values with length between 2 and 10
      isUUID: 4,                // only allow uuids
      isDate: true,             // only allow date strings
      isAfter: "2011-11-05",    // only allow date strings after a specific date
      isBefore: "2011-11-05",   // only allow date strings before a specific date
      max: 23,                  // only allow values <= 23
      min: 23,                  // only allow values >= 23
      isCreditCard: true,       // check for valid credit card numbers

      // Examples of custom validators:
      isEven(value) {
        if (parseInt(value) % 2 !== 0) {
          throw new Error('Only even values are allowed!');
        }
      }
      isGreaterThanOtherField(value) {
        if (parseInt(value) <= parseInt(this.otherField)) {
          throw new Error('Bar must be greater than otherField.');
        }
      }
    }
  }
});