jQuery Validation插件始终显示错误消息

时间:2017-09-19 19:27:44

标签: javascript jquery meteor jquery-plugins

我为数据库中的电子邮件检查创建自定义验证。

客户端:

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);
  });
});

在这两种情况下,我都会收到验证消息,即电子邮件不是唯一的。

1 个答案:

答案 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
  }
});