gpt4 book ai didi

javascript - 在这个 Mongoose 独特的预保存验证中我做错了什么?

转载 作者:IT老高 更新时间:2023-10-28 22:04:01 27 4
gpt4 key购买 nike

我正在尝试创建一个具有唯一用户名的用户模型。这是它的代码:

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);

我也在测试唯一性是否有效:

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();
});

问题是,事实并非如此。每次运行代码时,都会创建一个新对象。我知道可能还有其他方法可以确保唯一性,但我想以这种方式进行。我不应该在处理 findOne 方法的结果后调用 done 吗?我是不是调用 next 错了?

最佳答案

http://mongoosejs.com/docs/api.html#schematype_SchemaType-unique是要走的路。它使用实际的 MongoDb 索引来确保您的字段是唯一的。不需要 .pre 中间件。

享受吧!

关于javascript - 在这个 Mongoose 独特的预保存验证中我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11872556/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com