Ich versuche ein Benutzermodell zu erstellen, das einen eindeutigen Benutzernamen hat. Hier ist der Code für sie:Was mache ich falsch in dieser Mongoose einzigartigen Pre-Save-Validierung?
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);
ich auch, wenn die Einzigartigkeit Werke zu sehen, die Prüfung:
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();
});
Problem ist, ist es nicht. Jedes Mal, wenn ich den Code ausführe, erhalte ich ein neues Objekt. Ich bin mir bewusst, dass es wahrscheinlich andere Möglichkeiten gibt, Einzigartigkeit zu gewährleisten, aber ich würde es gerne so machen. Sollte ich nicht anrufen done
, nachdem ich das Ergebnis der findOne
Methode behandeln? Rufe ich next
falsch?
Es hat funktioniert, aber das Fehlerformat ist nicht das gleiche. Wenn Sie also eine API erstellen und auf das Format des Fehlerobjekts zählen, werden Sie wahrscheinlich Probleme mit diesem Ansatz haben. Ich habe den https://npmjs.org/package/mongoose-unique-validator getestet und es hat wie ein Zauber für mich funktioniert. Das Fehlerobjekt ist ziemlich gleich. –
für mich, das hat nicht funktioniert, ich musste die Signatur der Funktion ändern, um nur ein Argument zu haben (nächste) und dann nächsten mit Fehler oder nächsten ohne Parameter entsprechend – Matus
@Matus Es gibt zwei Arten von 'pre' [ Middleware] (http://mongoosejs.com/docs/middleware.html): parallel (mit den 'next' und' done' Parametern) und seriell (mit nur 'next'). – JohnnyHK