[英]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.