How to catch the error when inserting a MongoDB document which violates an unique index?
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 }); });})
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!' });
Try this:
app.post('/authenticate', function(req, res) { var user = new User({ username: req.body.username }); user.save(function(err) { if (err) { // you could avoid http status if you want. I put error 500 return res.status(500).send({ success: false, message: 'User already exist!' }); } res.json({ success: true }); }); })