Type d’erreur de validation unique Mongoose

J’utilise ce schéma avec mongoose 3.0.3 de NPM:

 var schema = new Schema({ _id: Schema.ObjectId, email: {type: Ssortingng, required: true, unique: true} }); 

Si j’essaye de sauvegarder un email qui est déjà dans la firebase database, je m’attends à obtenir une ValidationError comme si un champ required était omis. Cependant, ce n’est pas le cas. J’ai un MongoError: E11000 duplicate key error index .

Ce qui n’est pas une erreur de validation (se produit même si je supprime l’unique: true).

Une idée pourquoi?

Je préfère le mettre dans des mécanismes de validation de chemin, comme

 UserSchema.path('email').validate(function(value, done) { this.model('User').count({ email: value }, function(err, count) { if (err) { return done(err); } // If `count` is greater than zero, "invalidate" done(!count); }); }, 'Email already exists'); 

Ensuite, il va juste être emballé dans ValidationError et sera retourné comme premier argument lorsque vous appelez validate ou save .

C’est le comportement attendu

L’ unique: true équivaut à définir un index dans mongodb comme ceci:

 db.myCollection.ensureIndex( { "email": 1 }, { unique: true } ) 

Pour effectuer ce type de validation à l’aide de Mongoose (Mongoose appelle cette validation complexe, c’est-à-dire que vous n’affirmez pas que la valeur est un nombre, par exemple), vous devez vous connecter à l’événement de pré-sauvegarde:

 mySchema.pre("save",function(next, done) { var self = this; mongoose.models["User"].findOne({email : self.email},function(err, results) { if(err) { done(err); } else if(results) { //there was a result found, so the email address exists self.invalidate("email","email must be unique"); done(new Error("email must be unique")); } else { done(); } }); next(); });