Sto provando a creare un modello Utente, che ha un nome utente univoco. Ecco il codice per esso:Che cosa sto sbagliando in questa convalida unica pre-salvataggio Mongoose?
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);
ero anche testando per vedere se le opere unicità:
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();
});
Il problema è che non. Ogni volta che eseguo il codice, ottengo un nuovo oggetto creato. Sono consapevole che probabilmente ci sono altri modi per garantire l'unicità, ma mi piacerebbe farlo in questo modo. Non dovrei chiamare done
dopo aver gestito il risultato del metodo findOne
? Sto chiamando next
sbagliato?
Ha funzionato, ma il formato dell'errore non è lo stesso, quindi se stai costruendo un'API e contando sul formato dell'oggetto di errore probabilmente avrai problemi con questo approccio. Ho testato https://npmjs.org/package/mongoose-unique-validator e ha funzionato come un fascino per me. L'oggetto error è praticamente lo stesso. –
per me, questo non ha funzionato, ho dovuto cambiare la firma della funzione di avere un solo argomento (successiva) e quindi chiamando il prossimo con l'errore o il prossimo senza parametri di conseguenza – Matus
@Matus Ci sono due tipi di 'pre' [ middleware] (http://mongoosejs.com/docs/middleware.html): parallelo (con i parametri 'next',' done') e serial (con solo 'next'). – JohnnyHK