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.
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
});
});
})
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!' });
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
});
});
})