is responsilbe transfroming mongoose validation error into generic form.
npm i mongoose-validation-error-message-handler
const mongoose = require('mongoose'); const mongooseErrorHandler = require('mongoose-validation-error-message-handler'); const schema = new mongoose.Schema({ name: { type: String, required: true, }, }); const model = mongoose.model('person', schema); const object = new model({}); object.save(function (err, doc) { if (err) { const error = mongooseErrorHandler(err); console.log(error); /** * Error [MongooseValidatorError]: "name" is required * message: "name" is required * name: 'MongooseValidatorError', * path: 'name', * kind: 'required', * value: undefined */ } });
const mongoose = require('mongoose'); const mongooseErrorHandler = require('mongoose-validation-error-message-handler'); const schema = new mongoose.Schema({ name: { type: String, }, }); const model = mongoose.model('person', schema); const object = new model({ name: {} }); object.save(function (err, doc) { if (err) { const error = mongooseErrorHandler(err, { messages: { string: '{path} must be a string' } }); console.log(error); /** * Error [MongooseValidatorError]: name must be a string * message: name must be a string * name: 'MongooseValidatorError', * path: 'name', * kind: 'string', * value: {} */ } });
const mongoose = require('mongoose'); const mongooseErrorHandler = require('mongoose-validation-error-message-handler'); const schema = new mongoose.Schema({ name: { type: String, required: true, }, }); const model = mongoose.model('person', schema); const object = new model({}); object.save(function (err, doc) { if (err) { const error = mongooseErrorHandler(err, { paths: { name: { origin: true }, nameX: { origin: true, kind: 'maxlength' }, } }); console.log(error); /** * person validation failed: name: Path `name` is required. */ } });
const mongoose = require('mongoose'); const mongooseErrorHandler = require('mongoose-validation-error-message-handler'); const schema = new mongoose.Schema({ name: { type: String, required: true, }, }); const model = mongoose.model('person', schema); const object = new model({}); object.save(function (err, doc) { if (err) { const error = mongooseErrorHandler(err, { paths: { name: { message: 'name is required' }, nameX: { message: 'name length must be less than or equal to {maxlength} characters long', kind: 'maxlength' }, } }); console.log(error); /** * Error [MongooseValidatorError]: name is required * name: 'MongooseValidatorError', * path: 'name', * kind: 'required', * value: undefined */ } });
You will need to install package mongoose-unique-validator first.
const mongoose = require('mongoose'); const uniqueValidator = require('mongoose-unique-validator'); const mongooseErrorHandler = require('mongoose-validation-error-message-handler'); mongoose.Promise = Promise; mongoose.connect('mongodb://localhost/example', { useNewUrlParser: true, useUnifiedTopology: true, }); mongoose.plugin(uniqueValidator); const schema = new mongoose.Schema({ name: { type: String, unique: true, }, }); const model = mongoose.model('person', schema); const object = new model({ name: 'a' }); object.save(function (err, doc) { if (err) { const error = mongooseErrorHandler(err); console.log(error); /** * Error [MongooseValidatorError]: "name" already exists * name: 'MongooseValidatorError', * path: 'name', * kind: 'unique', * value: "a" */ } });
const express = require('express'); const mongoose = require('mongoose'); const mongooseErrorHandler = require('mongoose-validation-error-message-handler'); mongoose.Promise = Promise; mongoose.connect('mongodb://localhost/example', { useNewUrlParser: true, useUnifiedTopology: true, }); const schema = new mongoose.Schema({ name: { type: String, required: true, }, }); const model = mongoose.model('person', schema); const app = express(); app.use(express.json()); app.post('/', async (req, res, next) => { try { const object = await model.create(req.body); res.json(object); } catch (error) { next(error) } }); // catch 404 and forward to error handler app.use((req, res, next) => { const err = new Error('Not Found'); err.status = 404; next(err); }); // error handler app.use((err, req, res) => { let error = mongooseErrorHandler(err); if (error.name === 'MongooseValidatorError') { error.status = 400; } res.status(error.status || 500); res.json({ message: error.message }); }); app.listen(3000)
| Kind | Properties | Message | SchemaTypeOptions |
|---|---|---|---|
| base | path, value |
{path} is invalid | |
| boolean | path, value |
{path} must be a boolean | type |
| buffer | path, value |
{path} must be a buffer | type |
| date | path, value |
{path} must be a date | type |
| date.max | path, value, max |
{path} must be less than or equal to {max} | max |
| date.min | path, value, min |
{path} must be greater than or equal to {min} | min |
| enum | path, value, enumValues |
{path} is invalid | enum |
| maxlength | path, value, maxlength |
{path} length must be less than or equal to {maxlength} characters long | maxlength |
| minlength | path, value, minlength |
{path} length must be at least {minlength} characters long | minlength |
| map | path, value |
{path} must be a Map | type |
| number | path, value |
{path} must be a number | type |
| number.max | path, value, max |
{path} must be greater than or equal to {max} | max |
| number.min | path, value, min |
{path} must be less than or equal to {min} | min |
| objectId | path, value |
{path} must be a objectId | type |
| regexp | path, value, regexp |
{path} format is invalid | match |
| required | path, value |
{path} is required | required |
| string | path, value |
{path} must be a string | type |
| unique | path, value |
"{path}" already exists | unique |
| validate | path, value, enumValues |
{path} is invalid | validate |
path: String
original: Boolean,kind: String,message: String