首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValidateJS异步REST调用

ValidateJS异步REST调用
EN

Stack Overflow用户
提问于 2018-03-15 01:06:34
回答 1查看 231关注 0票数 0

我正在尝试创建一个验证器,它对我的服务器进行REST调用,并获取数据库的值。几个问题,当我的验证器启用时,它只验证输入,而不验证其余的约束。另外,我一直得到Id长度[validate.js] Attribute id has a non numeric value for length的这个错误,当我不使用异步验证器时,我不会收到这个错误。

这是我的验证器:

代码语言:javascript
复制
  validate.validators.myAsyncValidator = function(input, options, key, attributes) {
return new validate.Promise(function(resolve, reject) {
  if (!validate.isEmpty(input.value)) {
    axios.get('/data-management/verify-data', {
        params: {
          id: input.value,
          filter: options[0]
        }
      })
      .then(function(response) {
        if (response.data !== options[1]) resolve(" already exists!");
      })
      .catch(function(error) {
        resolve(": Error, try again.");
      });
  }
}); };

以下是我的制约因素:

代码语言:javascript
复制
var constraints = {
email: {
  presence: true,
  email: true
},
password: {
  presence: true,
  format: {
    // We don't allow anything that a-z and 0-9
    pattern: "^[a-zA-Z0-9!@#$&()\\-`.+,/\"]*$",
    // but we don't care if the username is uppercase or lowercase
    flags: "i",
    message: "Must contain at least 1 Uppercase, 1 Lowercase, 1 Number, and 1 Special Character"
  },
  length: {
    minimum: 6,
    message: "Must be at least 6 characters"
  }
},
"confirm-password": {
  presence: true,
  equality: {
    attribute: "password",
    message: "^The passwords does not match"
  }
},
district: {
  presence: true
},
id: {
  presence: true,
  length: {
    minimum: 5,
    maximum: 20,
    message: "Must be between 6-20 characters"
  },
  format: {
    // We don't allow anything that a-z and 0-9
    pattern: "[a-z0-9]+",
    // but we don't care if the username is uppercase or lowercase
    flags: "i",
    message: "can only contain a-z and 0-9"
  },
  myAsyncValidator: ["signup", false]
}};

我把约束和我的形式联系起来:

代码语言:javascript
复制
var inputs = document.querySelectorAll("input, textarea, select");
  for (var i = 0; i < inputs.length; ++i) {
    inputs.item(i).addEventListener("change", function(ev) {
      // var errors = validate.async(form, constraints).then(function(data) {
      //   console.log("data");
      // });
      var obj = this;
      var n = this.name;
      validate.async(form, constraints).then(function() {

      }, function(errors) {
        showErrorsForInput(obj, errors[n.valueOf()]);
      });


    });
  }

  function handleFormSubmit(form, input) {
    // validate the form against the constraints
    // var errors = validate.async(form, constraints).then(function(data) {
    //   console.log("data2");
    // });
    validate.async(form, constraints).then(function() {

    }, function(errors) {
      showErrors(form, errors || {});
      if (!errors) {
        showSuccess();
      }

    });

如果需要,我可以提供函子showErrors()、showSuccess()和showErrorsForInput()。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-15 15:40:56

找到了解决办法。首先检查ID约束,一旦它们消失,我就检查其余的约束。还添加了一个令牌程序来删除我正在接收的长度错误。

以下是更新的代码:

代码语言:javascript
复制
validate.validators.checkExists = function(input, options) {
    return new validate.Promise(function(resolve, reject) {
      if (!validate.isEmpty(input.value)) {
        axios.get('/data-management/verify-data', {
            params: {
              id: input.value,
              filter: options[0]
            }
          })
          .then(function(response) {
            if (response.data !== options[1]) resolve("already exists!");
            else resolve();
          })
          .catch(function(error) {
            reject(": Error, try again.");
          });
      } else resolve();
    });
  };

  // These are the constraints used to validate the form
  var constraints = {
    email: {
      presence: true,
      email: true
    },
    password: {
      presence: true,
      format: {
        pattern: "^[a-zA-Z0-9!@#$&()\\-`.+,/\"]*$",
        flags: "i",
        message: "Must contain at least 1 Uppercase, 1 Lowercase, 1 Number, and 1 Special Character"
      },
      length: {
        minimum: 6,
        message: "must be at least 6 characters"
      }
    },
    "confirm-password": {
      presence: true,
      equality: {
        attribute: "password",
        message: "^The passwords does not match"
      }
    },
    firstName: {
      presence: true
    },
    lastName: {
      presence: true
    },
    district: {
      presence: {
        message: "must be selected"
      }
    }
  };

  var idConstraints = {
    id: {
      presence: true,
      length: {
        minimum: 5,
        tokenizer: function(input) {
          try {
            return input.value;
          } catch (e) {
            return " ";
          }
        }
      },
      checkExists: ["signup", false]
    }
  };

  // Hook up the form so we can prevent it from being posted
  var form = document.querySelector("form#signup");
  form.addEventListener("submit", function(ev) {
    ev.preventDefault();
    handleFormSubmit(form);
  });

  // Hook up the inputs to validate on the fly
  var inputs = document.querySelectorAll("input, textarea, select");
  for (var i = 0; i < inputs.length; ++i) {
    inputs.item(i).addEventListener("change", function(ev) {
      var obj = this;
      var n = this.name;

      validate.async(form, idConstraints).then(function() {
        var moreErrors = validate(form, constraints) || {};
        showErrorsForInput(obj, moreErrors[n.valueOf()]);
      }, function(errors) {
          showErrorsForInput(obj, errors[n.valueOf()]);
      });
    });
  }

  function handleFormSubmit(form) {
    validate.async(form, idConstraints).then(function() {
      var errors = validate(form, constraints);
      showErrors(form, errors || {});
    }, function(errors) {
      showErrors(form, errors || {});
      if (!errors) {
        showSuccess();
      }
    });
  }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49290020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档