自定义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中,因此您不能将密码长度策略作为UserSchemavalidation的一部分执行。 你需要做到这一点之前,你到哈希/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已经做了很多次了。 依靠现有的广泛依赖实施可能是比试图推出自己的想法更好的主意。 例如:

https://www.npmjs.com/package/passport-local