Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom Error Messages with Mongoose

So according to the mongoose docs, you are supposed to be able to set a custom error message in the schema like so:

 var breakfastSchema = new Schema({   eggs: {     type: Number,     min: [6, 'Too few eggs'],     max: 12   },   bacon: {     type: Number,     required: [true, 'Why no bacon?']   } }); 

So I wanted to do something similar:

var emailVerificationTokenSchema = mongoose.Schema({    email: {type: String, required: true, unique: [true, "email must be unique"]},    token: {type: String, required: true},    createdAt: {type: Date, required: true, default: Date.now, expires: '4h'} }); 

The idea being that when you attempt to save one of these tokens, and there is already a conflicting one it'll pump out an error message that says "email must be unique".

However when I do something like this (where I save a token with the same email):

verificationToken.save( function (err) {     if (err) {       return console.log(err);     }     else {       return console.log(err);     } }); 

I keep getting this:

'E11000 duplicate key error: index ___.emailVerificationToken.$email_1 dup key: { : "[email protected] 

Any thoughts? Is unique parameter not supported for custom messages? Is this a viable way of going about things?

like image 361
Vangogh500 Avatar asked Aug 14 '16 18:08

Vangogh500


People also ask

Does Mongoose throw error?

When we run code to save or update the data, all validator runs and if any issue is found by the validator, mongoose throws the error. But these errors are completely different, different validators send errors in different ways.

Is Mongoose validation customizable?

Validation is an important part of the mongoose schema. Along with built-in validators, mongoose also provides the option of creating custom validations.

What is custom error message?

Custom error pages enable you to customize the pages that display when an error occurs. This makes your website appear more professional and also prevents visitors from leaving your site.

What is Mongoose error?

MongooseError : general Mongoose error. CastError : Mongoose could not convert a value to the type defined in the schema path. May be in a ValidationError class' errors property.


2 Answers

Is unique parameter not supported for custom messages?

Uniqueness in Mongoose is not a validation parameter (like required); it tells Mongoose to create a unique index in MongoDB for that field.

The uniqueness constraint is handled entirely in the MongoDB server. When you add a document with a duplicate key, the MongoDB server will return the error that you are showing (E11000...).

You have to handle these errors yourself if you want to create custom error messages. The Mongoose documentation ("Error Handling Middleware") provides you with an example on how to create custom error handling:

emailVerificationTokenSchema.post('save', function(error, doc, next) {   if (error.name === 'MongoError' && error.code === 11000) {     next(new Error('email must be unique'));   } else {     next(error);   } }); 

(although this doesn't provide you with the specific field for which the uniqueness constraint failed)

like image 135
robertklep Avatar answered Oct 22 '22 15:10

robertklep


It is not directly possible as you tried it but you may want to have a look at mongoose-unique-validator which allows for custom error message if uniqueness would be violated.

In particular the section about custom errors should be of interest to you.

To get your desired

"email must be unique"

it would look similar to this

var uniqueValidator = require('mongoose-unique-validator'); ... emailVerificationTokenSchema.plugin(uniqueValidator, { message: '{PATH} must be unique' }); 
like image 35
DAXaholic Avatar answered Oct 22 '22 14:10

DAXaholic