【发布时间】: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