Sails.js中的密码确认和外部模型验证

时间:2014-02-21 13:30:55

标签: node.js validation orm sails.js waterline

我可能有一天一直在玩Sails。我试图围绕在Sails.js中进行大量验证的最佳方式。

以下是该方案:

Registration Form:

Username: _______________
E-Mail:   _______________
Password: _______________
Confirm:  _______________

用户输入:

  • 正确的电子邮件
  • 已存在的用户名
  • 两个不匹配的密码

期望的结果:

Username: _______________ x Already taken
E-Mail:   _______________ ✓
Password: _______________ ✓
Confirm:  _______________ x Does not match

要求,几个要点:

  • 用户收到所有错误消息(不仅仅是第一个)输入的每个方面。它们不含糊(“用户名已被占用”或“用户名必须至少4个字母”优于“无效用户名”)
  • 内置模型验证显然不负责检查匹配的密码确认(SRP)

我认为我需要做什么:

UserController中:

create: function(req, res) {
    try {
        // use a UserManager-Service to keep the controller nice and thin
        UserManager.create(req.params.all(), function(user) {
            res.send(user.toJSON());
        });
    }
    catch (e) {
        res.send(e);
    }
}

的UserManager:

create: function(input, cb) {
    UserValidator.validate(input); // this can throw a ValidationException which will then be handled by the controller
    User.create(input, cb); // this line should only be reached if the UserValidator did not throw an exception
}

用户:(模特)

attributes: {
    username: {
        type: 'string',
        required: true,
        minLength: 3,
        unique: true
    },

    email: {
        type: 'email',
        required: true,
        unique: true
    },

    password: {
        type: 'string',
        required: true
    }
}

UserValidator:

这是棘手的部分。我需要将特定于输入的验证(密码确认是否匹配?)与模型验证(使用的用户名和电子邮件地址是否有效?)相结合。

如果有办法实例化用户模型并执行验证而不保存到Sails / Waterline中的数据库,我认为这很简单,但似乎没有那个选项。

你将如何解决这个问题?非常感谢你的帮助!

2 个答案:

答案 0 :(得分:8)

您可以在模型中执行此操作:

module.exports = {
types: {
    mycustomtype: function (password) {
        return password === this.confirm;
    }
},
attributes: {,
    password:{
        type: 'STRING',
        required: true,
        mycustomtype: true
    }
}
}

答案 1 :(得分:3)

您可以在客户端立即执行一些验证,而无需往返服务器。比较密码和确认密码,以及验证字符串匹配电子邮件正则表达式的事情可以通过客户端javascript完成。

对于检查是否存在用户名等其他内容,您可以使用ajax调用来直接询问sails这个用户名是否存在'并根据结果在客户端提供实时验证,或者您可以等到用户提交表单并解析表单提交以显示这些验证。由于这样的事情提前检查并不是100%可靠(即有人可以在检查后但在回传表格之前创建具有该名称的用户),有些人选择放弃预检和只在帖子后处理错误。

Waterline有自己的内置验证机制Anchor,它建立在validator.js(以前称为节点验证器)之上。有关可用验证的完整列表,请参阅here我建议您定义一种解析风帆验证消息的方法,而不是定义单独的验证层,并以一种用户友好且一致的方式对其进行格式化。

如果您想在Waterline为您做的事情之外执行自己的验证,您可以在lifecycle callback内进行验证,例如beforeCreate(values, callback)生命周期回调。如果检测到错误,则可以将它们作为第一个参数传递给回调,并将它们作为错误传递给create collection方法的调用者。

使用生命周期回调的替代方法是创建自己的处理创建的集合方法。像这样:

Users.validateAndCreate(req.params.all(), function (err, user) {
    ...
});

有关如何创建此类收藏方法的详细信息,请参阅我对此问题的回答:How can I write sails function on to use in Controller?