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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:31:55