猫鼬预保存-检查是否使用用户名

时间:2018-07-11 15:17:58

标签: node.js express mongoose

这是我的猫鼬模型

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!”。我最好在路由器本身而不是模型中使用验证吗?

2 个答案:

答案 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!")
    })
})