Quiero saber si es posible personalizar los errores de validación en mongoose cuando intento actualizar un documento.
Me sale este error de validación:
{ "err": { "errors": { "batch_number": { "message": "Path `batch_number` is required.", "name": "ValidatorError", "properties": { "type": "required", "message": "Path `{PATH}` is required.", "path": "batch_number", "value": "" }, "kind": "required", "path": "batch_number", "value": "" } }, "message": "Validation failed", "name": "ValidationError" } }Quiero responder un error como este.
{ "errors": { "batch_number": "Cannot be null or empty" } }Mi definición de modelo:
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const batchSchema = Schema({ batch_number:{type: String, required: true}, work_order_id:{ type: Schema.Types.ObjectId, ref: 'work_orders' ,required: true}, start_date_time:{type: Date, required: true}, end_date_time:{type: Date}, status:{type: String}, }, { timestamps: true }); const Batch = module.exports = mongoose.model('batches',batchSchema);Si obtengo más errores en otro campo, la respuesta debe ser:
{ "errors": { "batch_number": "Cannot be null or empty", "start_date_time": "must be a date" } }Gracias por adelantado
ACTUALIZAR:
Sigo la sugerencia de Andre y recibo el mismo mensaje de error.
const express = require('express') Batch = require('./../../database/controllers/production/batches'); function mongooseErrorHandler (err, req, res, next) { if (err.errors) { console.log(err); const error = {}; const keys = Object.keys(err.errors); keys.forEach((key) => { let message = err.errors[key].message; if (err.errors[key].properties && err.errors[key].properties.message) { message = err.errors[key].properties.message.replace('`{PATH}`', key); } message = message.replace('Path ', '').replace(key,'').trim(); error[key] = message; }); return res.status(500).json(error); //return next(error); } next(); }; module.exports = function(app){ app.put('/api/batches/:_id',mongooseErrorHandler,(req, res, err) => { var id = req.params._id; var batch = req.body; Batch.update(id, batch,{}, (err, batch) => { res.status(200).json(batch); }); }); }Debe crear un middleware para manejar los errores de mangosta:
function mongooseErrorHandler (err, req, res, next) { if (err.errors) { const error = {}; const keys = Object.keys(err.errors); keys.forEach((key) => { let message = err.errors[key].message; if (err.errors[key].properties && err.errors[key].properties.message) { message = err.errors[key].properties.message.replace('`{PATH}`', key); } message = message.replace('Path ', '').replace(key,'').trim(); error[key] = message; }); return res.status(500).json(error); // or return next(error); } next(); };Y añádelo a tus rutas. Por ejemplo:
router.get('/batch', mongooseErrorHandler, (req, res, err) =>{ ... }); o si está utilizando next(err) en el middleware:
router.get('/batch', mongooseErrorHandler, (req, res, err) =>{ if (err) res.status(500).json(err); ... });