Tôi đang cố gắng tạo Mô hình người dùng, có một tên người dùng duy nhất. Dưới đây là đoạn code cho nó:Tôi đang làm gì sai trong quá trình xác thực lưu trước duy nhất của Mongoose này?
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);
Tôi cũng đã được thử nghiệm để xem nếu các tác phẩm độc đáo:
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();
});
Vấn đề là, nó không. Mỗi lần tôi chạy mã, tôi nhận được một đối tượng mới được tạo ra. Tôi biết rằng có nhiều cách khác để đảm bảo tính độc đáo, nhưng tôi muốn làm theo cách này. Tôi có nên gọi số done
sau khi xử lý kết quả của phương pháp findOne
không? Tôi có gọi số next
không?
Nó hoạt động, nhưng định dạng lỗi không giống nhau vì vậy nếu bạn đang xây dựng một API và đếm định dạng đối tượng lỗi, bạn có thể sẽ gặp vấn đề với cách tiếp cận đó. Tôi đã thử nghiệm https://npmjs.org/package/mongoose-unique-validator và nó hoạt động như một sự quyến rũ đối với tôi. Đối tượng lỗi khá giống nhau. –
đối với tôi, điều này không hiệu quả, tôi phải thay đổi chữ ký của hàm để chỉ có một đối số (tiếp theo) và sau đó gọi tiếp theo với lỗi hoặc tiếp theo mà không có tham số tương ứng – Matus
@Matus Có hai loại 'pre' [ middleware] (http://mongoosejs.com/docs/middleware.html): song song (với tham số 'next',' done') và serial (chỉ với 'next'). – JohnnyHK