Come recuperare l'errore durante l'inserimento di un documento MongoDB che viola un indice unico?

Sto costruendo un'applicazione MEAN.

Questo è il mio schema di nome utente, il nome utente deve essere unico.

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

Sul mio path dell'alberino salvo l'utente come questo:

 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 }); }); }) 

Se invio nuovamente con lo stesso nome utente, ottengo questo errore:

MongoError: insertDocument :: causato da :: 11000 E11000 duplicare l'indice di errore chiave:

    Può qualcuno spiegare come invece di submit un json come { succes: false, message: 'User already exist!' } { succes: false, message: 'User already exist!' }

    Nota: dopo aver inviato l'utente autenticerò automaticamente, non ho bisogno di password o altro.

    Dovresti testare l'errore restituito dal metodo di salvataggio per vedere se è stato lanciato per un nome utente duplicato.

     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(500).send({ succes: false, message: 'User already exist!' }); } // Some other error return res.status(500).send(err); } res.json({ success: true }); }); }) 

    Prova questo:

     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 }); }); }) 

    Puoi anche provare questo bel pacchetto mongoose-unique-validator che rende molto più facile la gestione degli errori, in quanto avrai un errore di validation Mongoose quando si tenta di violare un vincolo unico, anziché un errore E11000 di 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!' });