Mongoose混合类型数组验证问题及自定义验证器未执行疑问
问题分析与解决方案
首先,很高兴你已经定位到了必填验证报错的根源——动态生成配置时误将services设为null。接下来咱们重点解决自定义验证器不执行的问题,核心原因其实是一个容易忽略的拼写错误,再结合Mongoose v4.13.8的特性来调整:
1. 修正验证器配置的拼写错误
你代码里写的是validator,但Mongoose Schema字段的验证选项正确的键是validate,这是导致验证器完全没触发的关键!Mongoose不会识别validator这个选项,所以你的isValidServices函数根本没被调用。
修正后的services字段定义应该是这样:
services: { type: [{}], required: true, validate: [isValidServices, "Not a valid service array"] // 把validator改成validate }
2. 验证器逻辑的补充说明
你的isValidServices函数逻辑是没问题的——遍历数组中的每个service,检查name是否为字符串。不过在Mongoose v4.13.8中,针对[{}]这种混合类型数组,需要注意:
- 当你通过
x-www-form-urlencoded格式提交数据时,Mongoose会自动把提交的键值对解析为数组对象,只要格式正确,验证器就能拿到完整的services数组。 - 如果数组中存在空对象(比如提交时某个
service没有name字段),你的验证器会返回false,符合预期。
3. 额外的调试小技巧
如果修正拼写后验证器还是没触发,可以试试这两个方法排查:
- 在
isValidServices函数开头加一句console.log('验证器执行了', services),确认函数是否被调用; - 检查保存文档时的代码,确保没有跳过验证(比如使用了
save({ validateBeforeSave: false }))。
内容的提问来源于stack exchange,提问作者oli_taz
相关产品推荐
相关产品推荐

