如何在Mongoose中验证localized_words为字符串映射数组的对象?
如何让Mongoose Schema验证localized_words为「字符串映射到数组」的对象?
你遇到的问题很典型——默认的Object类型验证太宽松,没法确保对象里的每个值都是数组。这里有两种靠谱的解决方案,看你的需求选:
方案一:自定义验证器(推荐,支持动态键)
这是最灵活的方式,不管你的语言键是预先定义的还是动态新增的,都能确保所有值都是数组。直接给localized_words加一个自定义验证函数就行:
var schema = mongoose.Schema({ localized_words: { type: Object, validate: { validator: function(obj) { // 遍历对象的所有值,确保每一个都是数组 return Object.values(obj).every(value => Array.isArray(value)); }, // 自定义错误提示,方便调试 message: props => `localized_words中的值不合法:${props.value} 里有非数组的属性!` } } });
验证效果:
- ✅ 成功案例:
{ en: ['car', 'apple'], fr: ['voiture', 'pomme'] }完全符合要求,顺利通过验证 - ❌ 失败案例:
{ en: [], fr: 123 }会触发验证错误,因为fr的值是数字而非数组
如果需要更严格的验证(比如确保数组里的元素都是字符串),可以把验证器改得更细致:
validator: function(obj) { return Object.values(obj).every(value => Array.isArray(value) && value.every(item => typeof item === 'string') ); }
方案二:预定义嵌套Schema(适合固定语言键)
如果你的语言键是固定的(比如永远只有en、fr这几个),可以直接用嵌套的Schema来定义,这样验证会更精准:
var schema = mongoose.Schema({ localized_words: { en: { type: [String], required: true }, // 要求en必须是字符串数组且必填 fr: { type: [String], required: true }, // 可以继续添加其他固定语言字段 } });
不过这种方法的局限性很明显:没法支持动态新增的语言键,所有键都得提前写在Schema里。
内容的提问来源于stack exchange,提问作者Saitama
相关产品推荐
相关产品推荐

