1

我正在尝试使用 Express 和 Mongoose 对用户输入进行一些验证。以前,我直接在用户模型的“密码”字段上设置了一个“最小长度”验证器。它将检查输入的密码字符串是否足够长,如果不是,它将传递给尝试保存用户时创建的 ValidationError 对象。这将被发送回用户,并显示在适当的表单字段中。

但是现在我已经实现了散列、盐和加密,这并不能正常工作。密码的哈希版本比原始密码长得多。所以我想我可以做这样的事情:

exports.createNewUser = function(req, res, next){

    var user = new User({
            email : req.body.email
        , name : req.body.name
    })
    ,   minLength = Validator.minLength(req.body.password);

    if (!minLength) return next(new Error('Password aint right length'));

    user.setPassword(req.body.password);

    user.save(function(err){
        if (!err) return res.redirect('/');
        else {
            console.log('error saving usr', err);
            err['body'] = req.body;
            return res.render('user/register', err);
        }
    });
};

问题是

return next(new Error('err message')); 

简单地显示在控制台上。我需要某种方式将它附加到 mongoose Validation Errors 对象。有任何想法吗?

4

1 回答 1

1

看了一圈后,我找到了解决办法。基本上,您可以在尝试保存模型之前调用模型上的“验证”功能。然后,您可以对模型中不一定设置的其他属性应用额外的验证。在这种情况下,我正在测试非散列密码字符串的长度,看看它是否足够长。如果不是,我将一个对象添加到返回的 err 对象中。然后可以将其发送回表单。

user.validate(function(err){
        if (req.body.password.length < 20) {
            err.errors.password = { type : 'the pw should be longer'};
        }
        console.log(err);
    });
于 2012-08-02T06:27:31.090 回答