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.
To create a unique index, use the db. collection. createIndex() method with the unique option set to true .
If you ever faced this error all you need to do is to check your model carefully and find out that is there any unique key set true by you and if it is not necessary then simply remove the unique key from the model or otherwise set a unique value if it is necessary to be unique.
The “_v” field in Mongoose is the versionKey is a property set on each document when first created by Mongoose. This key-value contains the internal revision of the document. The name of this document property is configurable.
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!' });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With