2017-04-13 64 views
0

我想知道是否可以在我尝试更新文档时自定义猫鼬中的验证错误。用猫鼬定制验证错误

我得到这个验证错误:

{ 
    "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" 
    } 
} 

我要回应这样的错误

{ 
    "errors": { 
     "batch_number": "Cannot be null or empty" 
     } 
} 

我的模型定义:

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

如果我能在其他更多的错误领域的回应必须是:

{ 
    "errors": { 
     "batch_number": "Cannot be null or empty", 
     "start_date_time": "must be a date" 
     } 
} 

在此先感谢

UPDATE:

我跟安德烈的建议,我也得到了同样的错误消息

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

回答

0

您应该创建一个中间件处理猫鼬的错误:

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

并将其添加到您的路线。例如:

router.get('/batch', mongooseErrorHandler, (req, res, err) =>{ 
    ... 
}); 

,或者如果您在使用中间件next(err)

router.get('/batch', mongooseErrorHandler, (req, res, err) =>{ 
    if (err) res.status(500).json(err); 
    ... 
}); 
+0

我按照你的建议,我也得到了相同的结果。我想我尝试实施您的解决方案时出错。请参阅更新 – joselegit

+0

感谢它的工作我犯了一个错误,当我修复它时,中间件功能正常工作 – joselegit

+0

很高兴帮助:) –