我正在尝试创建一个具有唯一用户名的用户模型。这是它的代码:
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();
});
问题是,事实并非如此。每次运行代码时,都会创建一个新对象。我知道,可能还有其他方法可以确保唯一性,但是我想以此方式进行。done
处理该findOne
方法的结果后,是否应该不打电话?我next
打错电话了吗?
要使用并行中间件(带有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();
});
问题内容: 为什么在此脚本中猫鼬唯一不起作用 我很困惑,结果就像 谢谢您的帮助。 问题答案: 发生这种情况是因为您要在完成索引创建之前保存重复的文档。在您的应用启动后,Mongoose可以随时随地创建索引。 因此,为确保仅在创建索引后才保存文档,您必须侦听模型事件。例如: 现在,当您尝试保存第二个文档(重复的文档)时,MongoDB将引发错误,因为您的调用将在创建索引后立即运行。
在这个React(使用JSX)代码中做什么,它叫什么?
我有一个要打印的值列表,并将每个打印保存为单独的文件。我创建了一个for循环,它可以很好地在IDE中显示绘图,但当我试图将它们保存在单独的文件中时,我会遇到这样的情况:第一个创建的png文件会随着每次迭代而被覆盖,而不是创建新文件。 这是我的循环 我添加奇怪的“y”值的原因是名称中包含斜杠,所以程序“认为”它是不同的文件夹。所以基本上我想得到plot1。png,图2。翁。。。普洛顿。结果是巴布亚新
我不知道我在这里有什么错误,但它不会编译。我得到的错误消息是/"fe"而没有"if"/ /not一个语句//没有"if"/ 我正在按照我作业中的样本所显示的方式来做,我仍然会遇到这个错误。请有人帮我学数学。PI。我完全迷路了。
创建验证 任何时候,都可以直接使用think\Validate类而不需要定义验证器类进行独立的验证操作,例如: $validate = Validate::make([ 'name' => 'require|max:25', 'email' => 'email' ]); $data = [ 'name' => 'thinkphp', 'email' => 't
本文向大家介绍ElementUI是怎么做表单验证的?在循环里对每个input验证怎么做呢?相关面试题,主要包含被问及ElementUI是怎么做表单验证的?在循环里对每个input验证怎么做呢?时的应答技巧和注意事项,需要的朋友参考一下 绑定表单数据,通过取表单数值,通过编写进行后台API验证 ,根据进行表单内容验证