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

Mongoose Schema配置的数据类型验证不生效如何解决

问题原因
  • Mongoose 默认对 Schema 中定义为 String 类型的字段会开启隐式类型转换:传入数字类型的值时,会自动转换为对应字符串格式存储,所以你传入数字1默认应该会被转为"1"存入,不会保留数值类型。
  • 你当前遇到数字能直接作为数值类型存入且没有报错,大概率是两种情况:
    1. 你在全局配置或者当前 Schema 配置中关闭了 String 类型的数字自动转换规则,同时没有开启强制类型校验
    2. 你配置了 strict: false 等非严格 Schema 规则,跳过了字段类型校验逻辑
  • 额外说明:Schema 中定义的 required: true 仅校验字段是否存在、非空,不会校验字段值的类型是否匹配。
修复方案

你可以通过以下几种方式实现严格的类型校验,避免非字符串类型值存入nome字段:

  1. 开启 String 类型数字自动转换(默认是开启的,如果你之前手动关了可以重新打开),在定义 Schema 时添加对应配置即可:
const Postschema = new mongoose.Schema({
  nome: {
    type: String,
    required: true,
    trim: true
  },
  email: {
    type: String,
    required: true,
    trim: true
  },
  morada: {
    type: String,
    required: true,
    trim: true
  }
}, {
  castNumbersToStrings: true // 开启String字段自动转换数字为字符串,默认值就是true,如果你之前设为false可以改回
})
  1. 如果你不想要自动转换,要求传入的值必须本身就是字符串类型,不符合就抛出错误,可以添加自定义校验规则:
nome: {
  type: String,
  required: true,
  trim: true,
  validate: {
    validator: function(v) {
      return typeof v === 'string'
    },
    message: props => `${props.value} 不是字符串类型`
  }
}
  1. 检查全局配置,确保没有关闭Mongoose的默认类型转换逻辑,不要在全局设置 mongoose.set('cast', false) 这类关闭转换的配置。
  2. 确认 Schema 没有设置 strict: false,该配置会允许未在Schema中定义的字段存入,也会跳过部分类型校验逻辑。

补充说明:如果后续你使用 update、updateOne 等方法修改数据,需要额外添加 runValidators: true 配置才会触发 Schema 定义的校验规则,示例:

Post.updateOne({_id: 文档ID}, {$set: {nome: 1}}, {runValidators: true})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:57:04