Express自定义验证器始终返回错误,求排查问题原因
问题原因及解决方案
你的问题出在自定义验证函数没有返回异步操作的Promise,导致express-validator无法正确等待数据库查询结果,直接判定验证失败,所以不管ifIDAlreadyExist返回true还是false,都会触发"ID already exists"的错误。
具体分析
ifIDAlreadyExist是异步函数(返回Promise),但你在.custom()的回调里只调用了它,却没有把这个Promise返回给express-validator。框架无法感知异步操作的完成状态,会默认认为验证未通过,因此触发后续的.withMessage错误信息。
修复后的代码
const RegInputValdiationRules = () => { return [ check("id") .not() .isEmpty() .withMessage("Please enter the login id") .custom((value) => { // 关键:返回Promise链,让express-validator等待异步结果 return ifIDAlreadyExist(value).then((exists) => { console.log(exists); if (exists === true) { return Promise.reject("ID already exists"); // 直接在这里返回错误信息更清晰 } }); }) .withMessage("ID already exists"), check("password") .not() .isEmpty() .isLength({ min: 6 }) .withMessage("Password should contain at least six characters"), ]; };
额外优化建议
- 可以把
Promise.reject的参数直接设为错误信息,这样比依赖后续的.withMessage更直观,也避免多个地方维护同一条提示。 - 用async/await简化异步代码,可读性更强:
.custom(async (value) => { const exists = await ifIDAlreadyExist(value); console.log(exists); if (exists) { throw new Error("ID already exists"); } })
内容的提问来源于stack exchange,提问作者Maya
相关产品推荐
相关产品推荐

