自定义validation器在检查空密码时不起作用
我正在使用bcrypt来散列用户的密码。 所以我有以下接口:
app.post("/user", function(req, res, next) { // hash the password asynchronously bcrypt.hash(req.body.password, null, null, function(err, hash) { var newUser = new User({ username: req.body.username, password: hash, email: req.body.email }); newUser.validate(function (err) { if (err) { logger.info("User registration aborted: " + err.toString()); return res.status(400).json(err); } else { newUser.save(function (err, user) { if (err) { return res.status(500).json(err); } else { console.log(user.username + " saved succesfully."); logger.info("User " + user._id + " registered."); return res.json(user); } }); } }); }); });
用户可以input一个空密码(“”),这个密码也会被散列。 我不希望用户应该能够创build短的x和更长的y字符的密码。 因此,我想使用自定义validation程序来中止:
UserSchema.path("password").validate(function (value) { bcrypt.compare("", value, function(err, equal) { console.log(this.username + ": " + value + ", " + equal); return !equal; }); }, "password empty");
这不起作用,空密码将被散列而不会出现错误。 这当然不能解决密码太长或太短的问题。
您不会将明文密码存储在mongoDB中,因此您不能将密码长度策略作为UserSchema
validation的一部分执行。 你需要做到这一点之前,你到哈希/mongoose的一面。 像这样的东西,例如:
app.post("/user", function(req, res, next) { var pw = req.body.password; if (!pw || pw.length > max || pw.length < min) { return res.status(400).send('Password is required and must be > x and < y...'); } // hash the password asynchronously // ... });
然而,你似乎在这里重新发明轮子。 用户名/密码login已经做了很多次了。 依靠现有的广泛依赖实施可能是比试图推出自己的想法更好的主意。 例如: