Joi es una librería de Javascript que te ayuda a definir esquemas para validar entradas contra estos esquemas (objetos js).
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)
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);
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.');
}
}
}
}
});