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