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
相关产品推荐
相关产品推荐

