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

Mongoose模型字段设required与default后仍触发验证失败的原因

问题原因及解决方案

这个问题我之前也碰到过,核心原因主要有两个,最常见的是字段类型的写法错误,另一个是显式传入了undefined导致默认值不生效:

1. 字段类型使用了字符串字面量而非原生构造函数

你在定义字段时写的是type: 'String'(带引号的字符串),但Mongoose要求使用原生的JavaScript构造函数String(不带引号)。虽然Mongoose对字符串类型标识有一定兼容性,但这种写法会干扰默认值的应用逻辑——当你创建新记录且未提供phoneNumber时,Mongoose没有正确触发默认值的赋值,导致required验证检测到字段缺失,抛出Path 'phoneNumber' is required异常。

修正后的模型定义

const yourModelSchema = new mongoose.Schema({
  phoneNumber: { 
    type: String,  // 去掉引号,用原生构造函数
    required: true, 
    default: '' 
  }
});

2. 显式传入了phoneNumber: undefined

如果你的创建记录代码中,不小心显式传递了phoneNumber: undefined,Mongoose不会应用默认值——它只会在字段完全不存在于传入对象中时,才会使用默认值。这种情况下,required验证依然会触发。

排查方向

检查创建记录的代码,比如:

// 错误示例:显式传入undefined
await YourModel.create({ phoneNumber: undefined });

// 正确示例:不传入该字段,或传入空字符串
await YourModel.create({}); // 会自动应用default: ''
await YourModel.create({ phoneNumber: '' }); // 直接满足required要求

验证测试

修改完模型后,尝试创建一条不包含phoneNumber的记录,应该能正常通过验证,默认值''会被自动赋值到新文档中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:37:19