繁体   English   中英

NodeJS + Validate.js多个异步验证器

[英]NodeJS + Validate.js multiple async validators

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

代码: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,则可以正确返回时区错误。 如果我对它们都未加注释,则会引发以下未处理的承诺拒绝:

(节点:25280)UnhandledPromiseRejectionWarning:#(节点:25280)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。 引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:1)(节点:25280)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。 将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。

我猜我的错误是在某种程度上束缚了这些诺言,但我真的不知道如何实现(如果我是对的话)。 我愿意接受任何建议,想法和指示。

我发现了自己的错误,事实证明,如果出现错误,我不应该拒绝诺言。 相反,我应该用错误消息解决它。 示例(对于两个验证器):

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

代替

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM