【问题标题】:NodeJS + Validate.js multiple async validatorsNodeJS + Validate.js 多个异步验证器
【发布时间】:2018-11-01 11:49:34
【问题描述】:

我对 NodeJS 有点陌生,我正在尝试对其中两个字段使用自定义异步验证器。我使用异步验证器的原因是必须向数据库发出请求以检查具有该 ID 的记录是否已经存在。我实现了两个验证器(下面列出的代码)——如果我在 validate.async 约束中只使用其中一个,它们每个都可以工作。但是,如果我同时使用它们,则会抛出未处理的 Promise 拒绝(确切的错误也在下面),并且只返回第一个验证器的错误。

代码: timezoneValidateAsync:

function valAsync(value) {
    return new validate.Promise(async function(resolve, reject) {
      const timezone = await Timezone.findById(value);
      if (!timezone) {
        reject(ValidationErrors.NOSUCHTIMEZONE);
      }
      resolve();
    });
  }

  validate.validators.timezoneValidateAsync = valAsync;

languageValidateAsync:

function valAsync(value) {
    return new validate.Promise(async function(resolve, reject) {
      const language = await Language.findById(value);
      if (!language) {
        reject(ValidationErrors.NOSUCHLANGUAGE);
      }

      resolve();
    });
  }

  validate.validators.languageValidateAsync = valAsync;

在 validate.async 中的使用:

constraints = {
      timezoneId: {
        presence: {
          message: ValidationErrors.TIMEZONEIDEXISTS
        },
        numericality: {
          greaterThan: 0,
          message: ValidationErrors.TIMEZONEIDGREATERTHANZERO
        },
        timezoneValidateAsync: {}
      },
      languageId: {
        presence: {
          message: ValidationErrors.LANGUAGEIDEXISTS
        },
        numericality: {
          greaterThan: 0,
          message: ValidationErrors.LANGUAGEIDGREATERTHANZERO
        },
        languageValidateAsync: {}
      }
    };

validate.async({
        timezoneId: fpreferencesDS.timezoneId,
        languageId: fpreferencesDS.languageId
      }, constraints).then(() => {
        next();
      }, errors => {
        console.log(errors);
        return;
      });

如果我注释掉 timezoneValidateAsync 验证器,语言错误会在 errors 变量中正常返回。如果我注释掉 languageValidateAsync,则返回时区错误。如果我让它们都未注释,则会引发以下未处理的承诺拒绝:

(node:25280) UnhandledPromiseRejectionWarning: # (node:25280) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这 错误源于在异步函数内部抛出 没有 catch 块,或拒绝未处理的承诺 使用 .catch()。 (拒绝 ID:1)(节点:25280)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。在 未来,未处理的承诺拒绝将终止 具有非零退出代码的 Node.js 进程。

我想我的错误在于以某种方式链接这些承诺,但我真的不知道该怎么做(如果我完全正确的话)。我愿意接受任何建议、想法和指示。

【问题讨论】:

    标签: javascript node.js promise validate.js


    【解决方案1】:

    我发现了我的错误,事实证明我不应该在出现错误时拒绝承诺。相反,我应该使用错误消息来解决它。示例(对于两个验证器):

    if (!timezone) {
       resolve(ValidationErrors.NOSUCHTIMEZONE);
       return;
    }
    

    而不是

    if (!timezone) {
       reject(ValidationErrors.NOSUCHTIMEZONE);
       return;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-16
      • 2016-08-30
      • 2019-07-08
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2019-03-15
      • 2015-09-01
      相关资源
      最近更新 更多