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

mongoose@6.6.1异步自定义验证器失效问题求助

解决Mongoose 6.6.1异步自定义验证失效问题

你的代码问题出在validateTags函数的异步逻辑实现上,虽然声明了async,但内部的setTimeout没有被正确包装为Promise,导致验证逻辑没有按预期执行。

问题根源

setTimeout是基于回调的异步API,你在async函数里直接使用它时,回调里的return不会传递到外层函数。这会导致validateTags实际上立即返回一个状态为resolved的Promise,值为undefined,Mongoose无法拿到正确的验证结果,自然无法生效。

修正代码

把setTimeout包装成Promise,让异步操作的结果能正确传递:

const courseSchema = new mongoose.Schema({
  tags: {
    type: Array,
    validate: {
      validator: validateTags, // 直接传递返回Promise的函数,Mongoose会自动处理异步
      message: "A Course should have at least one tag.",
    },
  }
});

const validateTags = (v) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      // 执行验证逻辑,将结果通过resolve返回
      resolve(v && v.length > 0);
    }, 2000);
  });
};

额外说明

Mongoose 6+已经废弃了isAsync选项,只要你的验证函数返回Promise(或者是async函数),Mongoose就会自动等待异步操作完成并根据结果判断验证是否通过。如果偏好async函数写法,也可以改成这样:

const validateTags = async (v) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(v && v.length > 0);
    }, 2000);
  });
};

本质都是确保验证函数返回一个能正确传递验证结果的Promise,而不是依赖回调的return。

内容的提问来源于stack exchange,提问作者Raghul Srt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:26:19