Mongoose新增产品到MongoDB报color必填错误如何解决?
问题原因
- 核心错误是
product_type的Schema定义不符合Mongoose的数组规则:你当前写的product_type: [ {color: 配置}, {size: 配置} ]会被Mongoose识别为「数组内所有元素必须同时满足这两个对象的校验规则」,也就是每一个数组元素都必须同时包含必填的color和size字段。你传入的数组第二个元素只有size没有color,因此触发了必填校验报错。 - 附加问题1:
size字段的类型和枚举值不匹配:你给size设置的type是Number,但enum枚举值写的是字符串类型的'40'、'41'、'42',后续即使解决结构问题也会触发类型校验失败。 - 附加问题2:测试数据中
size赋值为数组[41,42],但你当前Schema定义的size是单个Number类型,也会触发校验错误。 - 额外注意:你Schema中
price的type是String,但测试数据传的是数字150,后续也会出现类型不匹配的问题。
修复方案
根据你实际的业务需求,可选择以下两种方案之一:
方案1:商品规格为SKU形式(每个规格同时对应颜色+尺寸,电商常规用法)
修改product_type的Schema定义,将color和size放在同一个子对象内:
const productSchema = new Schema({ // 其他字段保持不变 product_type: [ { color: { type: String, required: true, }, size: { type: Number, required: true, enum: [40, 41, 42] // 枚举值改为和type匹配的数字类型 } } ] })
对应修改测试数据的product_type字段:
const p = new Product({ // 其他字段保持不变,price改为字符串'150'或者将Schema的price改为Number类型 price: '150', product_type: [ { color: 'red', size: 41 }, { color: 'red', size: 42 } ] })
方案2:单独存储所有可选颜色、所有可选尺寸
如果不需要关联颜色和尺寸,只需要分别存可选值,就把product_type改为对象类型,不要用数组:
const productSchema = new Schema({ // 其他字段保持不变 product_type: { color: [{ type: String, required: true }], size: [{ type: Number, required: true, enum: [40, 41, 42] }] } })
对应修改测试数据的product_type字段:
const p = new Product({ // 其他字段保持不变,price改为字符串'150'或者将Schema的price改为Number类型 price: '150', product_type: { color: ['red'], size: [41, 42] } })
内容的提问来源于stack exchange,提问作者Hadi Zouhbi
相关产品推荐
相关产品推荐

