在这个猫鼬独特的保存前验证中,我做错了什么
What am I doing wrong in this Mongoose unique pre-save validation?
我正在尝试创建一个具有唯一用户名的用户模型。这是它的代码:
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
中间件。
享受!
要使用并行中间件(带有next
和done
参数),您需要将true
作为第二个参数传递。
除此之外,还有两种可能性:
您的self.invalidate
调用应引用"username"
而不是"user"
。 如果这不能解决问题,您可以通过将 Error 对象传递给 done
是否要中止保存操作来显式失败:
UserSchema.pre("save", true, function(next, done) {
var self = this;
mongoose.models["User"].findOne({username: self.username}, function(err, user) {
if(err) {
done(err);
} else if(user) {
self.invalidate("username", "username must be unique");
done(new Error("username must be unique"));
} else {
done();
}
});
next();
});
有一个
非常好的猫鼬插件,非常易于安装和使用。文档非常好,它第一次对我有用。
但是重新保存存在问题。
https://npmjs.org/package/mongoose-unique-validator
您是否考虑过使用异步验证器来捕获错误?
UserSchema.path('username').validate(function (value, done) {
User.count({ username: value }, function (error, count) {
// Return false if an error is thrown or count > 0
done(!(error || count));
});
}, 'unique');
相关文章:
- 我应该使用什么正则表达式来验证数字模式
- 什么是英国电话号码验证表达式和语法
- 使用Javascript客户端进行REST基本身份验证的安全缺陷是什么(如果有的话)
- 在这个猫鼬独特的保存前验证中,我做错了什么
- 验证启动但不启动't显示故障信息.我错过了什么?MVC 5 Razor
- 使用谷歌登录网页时使用的身份验证令牌是什么
- 在表单中验证年龄但没有得到输出,不确定什么是不正确的
- 验证你的Instagram javascript API有什么好处
- 我想用 JavaScript 验证单选按钮,以测验我的代码需要什么
- html表单输入字段验证的正确方法是什么
- 什么是用于验证日期格式(如月/年)的正则表达式
- JavaScript 表单验证 - 这段代码有什么问题
- 护照身份验证在回调时做什么
- 用于验证范围内十进制值的正则表达式是什么 - 0 到 99999.00
- 我的验证码有什么问题?(正则表达式很好)
- Asp.net.服务器端验证和客户端验证很好地协同工作的最佳方式是什么?
- 我的 JavaScript 需要什么条件?它是一个弹出一个对话框的脚本,其中包含字段的表单验证备注留空
- 用Jquery验证表单出了什么问题
- 此HTTP Get-Basic身份验证代码有什么问题
- 自定义jQuery表单验证-什么是最佳方式