Es posible personalizar el error desde el
Sequelize.ValidationError
Modelo:
var PaymentType = sequelize.define('payment_type' , { id: { type: DataTypes.INTEGER(11), allowNull: false, primaryKey: true, autoIncrement: true, field: 'id' }, code: { type: DataTypes.STRING, allowNull: false, validate:{ notEmpty: true }, field: 'code' }, name: { type: DataTypes.STRING, allowNull: false, validate:{ notEmpty: true }, field: 'name' } }, { timestamps: true, paranoid: false, underscored: true, freezeTableName: true, tableName: 'payment_types' });
Mi controlador:
update(req, res) { paymentType .update(req.body, { where: { id: req.params.id } }) .then( updatedRecords => { res.status(200).json(updatedRecords); }) .catch(Sequelize.ValidationError, error => { res.status(400).json(error); }) .catch( error => { res.status(500).json(error); }); },
Los errores que obtengo, son de esta manera:
{ "name": "SequelizeValidationError", "message": "Validation error: Validation notEmpty failed", "errors": [ { "message": "Validation notEmpty failed", "type": "Validation error", "path": "name", "value": {}, "__raw": {} } ] }
Quiero pasar los errores como este (solo ruta y mensaje):
{ "name":"The field cannot be empty", "other_field":"custom error message" }
No sé si puedo especificar un mensaje personalizado en el modelo o si tengo que crear una función para generar los mensajes de error.
Si tengo que construir una función, ¿cómo puedo extraer la ruta y personalizar el mensaje?
Gracias de antemano.
Puede especificar un mensaje personalizado para la continuación de la Validación. Su código se verá así
`var PaymentType = sequelize.define('payment_type' , { id: { type: DataTypes.INTEGER(11), allowNull: false, primaryKey: true, autoIncrement: true, field: 'id' }, code: { type: DataTypes.STRING, allowNull: false, validate:{ notEmpty: { args: true, msg: “code cannot be empty" } }, field: 'code' }, name: { type: DataTypes.STRING, allowNull: false, validate:{ notEmpty: { args: true, msg: “code cannot be empty" } }, field: 'name' }
Especifiqué la regla de validación como un objeto, en el caso anterior, notEmpty
debería ser verdadero, así que lo refactoricé a un objeto estableciendo la propiedad args
en true
, es decir, notEmpty
debería ser true
, y la segunda propiedad es msg
, que contiene nuestro mensaje personalizado.
notEmpty: { args: true, msg: “code cannot be empty" }
Puede capturar el ValidationError de Sequelize y recorrer sus ValidationErrorItem y escribir un mensaje personalizado según el tipo de error (determinado por ValidationErrorItem.validatorKey ). Aquí hay un fragmento de código para comenzar.
try { // sequelize custom logic here } catch(e) { const messages = {}; if (e instanceof ValidationError) { e.errors.forEach((error) => { let message; switch (error.validatorKey) { case 'isEmail': message = 'Please enter a valid email'; break; case 'isDate': message = 'Please enter a valid date'; break; case 'len': if (error.validatorArgs[0] === error.validatorArgs[1]) { message = 'Use ' + error.validatorArgs[0] + ' characters'; } else { message = 'Use between ' + error.validatorArgs[0] + ' and ' + error.validatorArgs[1] + ' characters'; } break; case 'min': message = 'Use a number greater or equal to ' + error.validatorArgs[0]; break; case 'max': message = 'Use a number less or equal to ' + error.validatorArgs[0]; break; case 'isInt': message = 'Please use an integer number'; break; case 'is_null': message = 'Please complete this field'; break; case 'not_unique': message = error.value + ' is taken. Please choose another one'; error.path = error.path.replace("_UNIQUE", ""); } messages[error.path] = message; }); } }
¿Intentas cambiar el modelo de esta manera:
var PaymentType = sequelize.define('payment_type' , { id: { type: DataTypes.INTEGER(11), allowNull: false, primaryKey: true, autoIncrement: true, field: 'id' }, code: { type: DataTypes.STRING, allowNull: false, validate:{ notEmpty: { msg: "The field cannot be empty" } }, field: 'code' }, name: { type: DataTypes.STRING, allowNull: false, validate:{ notEmpty: { msg: "The field cannot be empty" } }, field: 'name' } }, { timestamps: true, paranoid: false, underscored: true, freezeTableName: true, tableName: 'payment_types' });