这是我的猫鼬模型
var mongoose = require('mongoose');
var UserSchema = mongoose.Schema({
username : {
type : String ,
unique : true,
required: true,
trim : true
},
password : {
type : String,
trim : true
}
})
UserSchema.pre('save', function (next) {
var self = this;
User.find({name : self.username}, function (err, docs) {
if (!docs.length){
next();
}else{
console.log('user exists: ',self.username);
next(new Error("User exists!"));
}
});
}) ;
var User = mongoose.model('User' , UserSchema);
module.exports = User;
我为此的路线处理程序是:
router.post('/login' , (req , res) => {
var user = new User({
username : req.body.username,
password : req.body.password
})
res.send('Clear!')
})
如果用户名已被使用,这应该停止保存,而是继续并写“ Clear!”。我最好在路由器本身而不是模型中使用验证吗?
答案 0 :(得分:0)
从逻辑上讲,在保存操作完成之前进行预保存。
您永远不会致电user.save()
,因此没有保存操作。
如果您使用User.create()
或User.update()
,还需要注意一些其他注意事项(配置选项),以进行预保存。
此外,请注意,这不会解决并发问题。如果您有两个人试图在彼此接近的时间范围内保存相同的名称,那么除非您也标记字段unique
以便像您一样在数据库中实施唯一约束,否则他们将能够这样做。但是请注意,在这种情况下,您会得到一个错误,您想捕获并正确处理它(您当前未在执行)。
我还要指出,您当前正在登录URL上创建用户。那真的是您要尝试做的事吗?
答案 1 :(得分:0)
您需要保存用户才能进行验证
router.post('/login' , (req , res) => {
var user = new User({
username : req.body.username,
password : req.body.password
})
user.save(function(err){
if(err) return res.send('Error')
return res.send("Clear!")
})
})