簡體   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