You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:54:21