Ce que je fais mal dans cette Mangouste unique de pré-enregistrer de validation?
Je suis en train de créer un modèle Utilisateur, qui dispose d'un nom d'utilisateur unique. Voici le code:
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var UserSchema = new Schema({
username: String,
password: String,
});
UserSchema.virtual("password_confirmation").get(function() {
return this.pw_conf;
}).set(function(value) {
this.pw_conf = value;
});
UserSchema.path("username").required(true);
UserSchema.path("password").required(true);
UserSchema.pre("save",function(next, done) {
var self = this;
mongoose.models["User"].findOne({username : self.username},function(err, user) {
if(user) {
self.invalidate("user","username must be unique");
}
done();
});
next();
});
UserSchema.pre("save",function(next) {
if(this.pw_conf !== this.password) {
next(new Error("Must specify the password confirmation"));
}
else {
next();
}
});
module.exports = mongoose.model("User",UserSchema);
J'ai été également à l'essai pour voir si l'unicité des œuvres:
var User = require("./users"),
mongoose = require("mongoose");
var u = new User();
mongoose.connect('mongodb://localhost/my_database');
u.username = "me";
u.password = "password";
u.password_confirmation = "password";
u.save(function(err) {
if(err) {
console.log(err);
}
mongoose.disconnect();
});
Problème est, il n'a pas. Chaque fois que je lance le code, j'obtiens un nouvel objet créé. Je suis conscient qu'il y a probablement d'autres moyens de s'assurer de l'unicité, mais j'aimerais le faire de cette façon. Je ne devrais pas appeler done
après je gérer le résultat de l' findOne
méthode? Suis-je appeler next
mal?
Vous devez vous connecter pour publier un commentaire.
À utiliser en parallèle middleware (avec
next
etdone
paramètres de), vous devez passertrue
comme second paramètre.Au-delà, il y a deux possibilités:
Votre
self.invalidate
appel doit être de référencement"username"
au lieu de"user"
. Si cela ne résout pas le problème, vous pouvez échouer les choses explicitement par le passage d'un objet d'Erreurdone
si vous souhaitez annuler l'opération d'enregistrement:pre
middleware: parallèle (avec lenext
, etdone
params), et de la série (avec juste lenext
).http://mongoosejs.com/docs/api.html#schematype_SchemaType-unique est le chemin à parcourir. Il utilise la MongoDb indices pour vous assurer que votre domaine est unique. Pas besoin de
.pre
middleware.Profitez-en!
Il y a un très bon plugin pour la mangouste qui est vraiment facile à installer et à utiliser. La documentation est excellente et il a travaillé pour moi première fois.
Mais il y a un problème avec les ré-enregistrer.
https://npmjs.org/package/mongoose-unique-validator
Avez-vous envisagé asynchrone à l'aide d'un programme de validation d'intercepter l'erreur?