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:

  1. this.model('User') didn't work for me.
  2. 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.