How to catch the error when inserting a MongoDB document which violates an unique index?

29,067

Solution 1

You will need to test the error returned from the save method to see if it was thrown for a duplicative username.

app.post('/authenticate', function(req, res) {
  var user = new User({
    username: req.body.username
  });

  user.save(function(err) {
    if (err) {
      if (err.name === 'MongoError' && err.code === 11000) {
        // Duplicate username
        return res.status(422).send({ succes: false, message: 'User already exist!' });
      }

      // Some other error
      return res.status(422).send(err);
    }

    res.json({
      success: true
    });

  });
})

Solution 2

You can also try out this nice package mongoose-unique-validator which makes error handling much easier, since you will get a Mongoose validation error when you attempt to violate a unique constraint, rather than an E11000 error from MongoDB:

var mongoose = require('mongoose');
var uniqueValidator = require('mongoose-unique-validator');

// Define your schema as normal.
var userSchema = mongoose.Schema({
    username: { type: String, required: true, unique: true }
});

// You can pass through a custom error message as part of the optional options argument:
userSchema.plugin(uniqueValidator, { message: '{PATH} already exists!' });
Share:
29,067
Hiero
Author by

Hiero

Updated on July 09, 2022

Comments

  • Hiero
    Hiero almost 2 years

    I'm building a MEAN app.

    This is my Username schema, the username should be unique.

    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;
    
    module.exports = mongoose.model('User', new Schema({ 
        username: { type: String, unique: true }
    }));
    

    On my post route I save the user like this:

    app.post('/authenticate', function(req, res) {
            var user = new User({
                username: req.body.username
            });
    
            user.save(function(err) {
                if (err) throw err;
    
                res.json({
                    success: true
                });
    
            });
        })
    

    If I post with the same username again I get this error:

    MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index:

    Can someone explain how instead of the error to send a json like { succes: false, message: 'User already exist!' }

    Note: After I post the user I will automatically authentificate, dont need password or something else.