我为数据库中的电子邮件检查创建自定义验证。
客户端:
Template.Login.onRendered(() => {
jQuery.validator.addMethod('checkEmailUnique', function(value, element) {
Meteor.call('checkEmailUnique', value, function(err, result) {
console.log('Email validator method response: ', result);
return result;
)};
});
$('.login-form').validate({
rules: {
emailAddress: {
required: true,
email: true,
checkEmailUnique: true
},
messages: {
checkEmailUnique: "email found"
}
});
});
服务器:
Meteor.methods({
// Chech the email to unique
checkEmailUnique:function(email){
if(email && Meteor.isServer){
let foundEmail = Meteor.users.findOne({'emails.address': email});
if (foundEmail) {
return false; // fails - display error
} else {
return true; // true - no message
}
}
}
});
在浏览器控制台中,我收到消息:
如果找到电子邮件 - false并且未找到电子邮件 - 是的,但两种情况下的插件都会点击我的验证消息"发现电子邮件"。
我做错了什么?
更新
因此,在第一个答案之后我将代码更改为:
Template.Login.onRendered(() => {
jQuery.validator.addMethod('checkEmailUnique', function(value, element) {
return Meteor.wrapAsync(Meteor.call)('checkEmailUnique', value, element);
});
});
在这两种情况下,我都会收到验证消息,即电子邮件不是唯一的。
答案 0 :(得分:1)
您的方法异步返回,因此返回值不会传递回验证程序。您需要将Meteor.call()
与Meteor.wrapAsync()
打包在一起才能同步使用它。
jQuery.validator.addMethod('checkEmailUnique', function(value, element) {
return Meteor.wrapAsync(Meteor.call)('checkEmailUnique', value);
});
如果您认为Meteor.call()
可能出错,则必须使用try-catch块,因为Meteor.wrapAsync()
正在返回结果而不是错误:
jQuery.validator.addMethod('checkEmailUnique', function(value, element) {
try {
return Meteor.wrapAsync(Meteor.call)('checkEmailUnique', value);
} catch(e) {
console.log(e); // handle the error as required
}
});