web-dev-qa-db-fra.com

Comment intercepter l'erreur lors de l'insertion d'un document MongoDB qui viole un index unique?

Je crée une application MEAN.

Ceci est mon schéma de nom d'utilisateur, le nom d'utilisateur doit être unique.

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

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

Sur mon itinéraire, j'enregistre l'utilisateur comme ceci:

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

        });
    })

Si je poste à nouveau avec le même nom d'utilisateur, j'obtiens cette erreur:

MongoError: insertDocument :: provoqué par :: 11000 E11000 index d'erreur de clé en double:

Quelqu'un peut-il expliquer comment au lieu de l'erreur d'envoyer un json comme { succes: false, message: 'User already exist!' }

Remarque: Après avoir posté l'utilisateur, je m'authentifierai automatiquement, je n'ai pas besoin de mot de passe ou d'autre chose.

17
Hiero

Vous devrez tester l'erreur renvoyée par la méthode save pour voir si elle a été levée pour un nom d'utilisateur en double.

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

  });
})
38
Jason Cust

Vous pouvez également essayer ce package Nice mongoose-unique-validator qui facilite la gestion des erreurs, car vous obtiendrez un Erreur de validation Mongoose lorsque vous essayez de violer une contrainte unique, plutôt qu'une erreur E11000 de 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!' });
3
chridam

Essaye ça:

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

        });
    })
2
Jose Mato