Mongoose Schema配置的数据类型验证不生效如何解决
问题原因
- Mongoose 默认对 Schema 中定义为 String 类型的字段会开启隐式类型转换:传入数字类型的值时,会自动转换为对应字符串格式存储,所以你传入数字1默认应该会被转为"1"存入,不会保留数值类型。
- 你当前遇到数字能直接作为数值类型存入且没有报错,大概率是两种情况:
- 你在全局配置或者当前 Schema 配置中关闭了 String 类型的数字自动转换规则,同时没有开启强制类型校验
- 你配置了
strict: false等非严格 Schema 规则,跳过了字段类型校验逻辑
- 额外说明:Schema 中定义的
required: true仅校验字段是否存在、非空,不会校验字段值的类型是否匹配。
修复方案
你可以通过以下几种方式实现严格的类型校验,避免非字符串类型值存入nome字段:
- 开启 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可以改回 })
- 如果你不想要自动转换,要求传入的值必须本身就是字符串类型,不符合就抛出错误,可以添加自定义校验规则:
nome: { type: String, required: true, trim: true, validate: { validator: function(v) { return typeof v === 'string' }, message: props => `${props.value} 不是字符串类型` } }
- 检查全局配置,确保没有关闭Mongoose的默认类型转换逻辑,不要在全局设置
mongoose.set('cast', false)这类关闭转换的配置。 - 确认 Schema 没有设置
strict: false,该配置会允许未在Schema中定义的字段存入,也会跳过部分类型校验逻辑。
补充说明:如果后续你使用 update、updateOne 等方法修改数据,需要额外添加
runValidators: true配置才会触发 Schema 定义的校验规则,示例:Post.updateOne({_id: 文档ID}, {$set: {nome: 1}}, {runValidators: true})
内容的提问来源于stack exchange,提问作者mlila_p
相关产品推荐
相关产品推荐

