Mongoose unique validation error type
I'm using this schema with mongoose 3.0.3
from npm:
var schema = new Schema({
_id: Schema.ObjectId,
email: {type: String, required: true, unique: true}
});
If I try to save a email that is already in db, I expect to get a ValidationError
like if a required
field is omitted. However this is not the case, I get a MongoError: E11000 duplicate key error index
.
Which is not a validation error (happens even if I remove the unique:true).
Any idea why?
Solution 1:
I prefer putting it in path validation mechanisms, like
UserSchema.path('email').validate(function(value, done) {
this.model('User').count({ email: value }, function(err, count) {
if (err) {
return done(err);
}
// If `count` is greater than zero, "invalidate"
done(!count);
});
}, 'Email already exists');
Then it'll just get wrapped into ValidationError
and will return as first argument when you call validate
or save
.
Solution 2:
I had some issues with the approved answer. Namely:
-
this.model('User')
didn't work for me. - the callback
done
wasn't working properly.
I resolved those issues by:
UserSchema.path('email').validate(async (value) => {
const emailCount = await mongoose.models.User.countDocuments({email: value });
return !emailCount;
}, 'Email already exists');
I use async/await
which is a personal preference because it is much neater: https://javascript.info/async-await.
Let me know if I got something wrong.