我可能有一天一直在玩Sails。我试图围绕在Sails.js中进行大量验证的最佳方式。
以下是该方案:
Registration Form:
Username: _______________
E-Mail: _______________
Password: _______________
Confirm: _______________
用户输入:
期望的结果:
Username: _______________ x Already taken
E-Mail: _______________ ✓
Password: _______________ ✓
Confirm: _______________ x Does not match
要求,几个要点:
我认为我需要做什么:
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中的数据库,我认为这很简单,但似乎没有那个选项。
你将如何解决这个问题?非常感谢你的帮助!
答案 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?