如何向Mongoose数组对象的属性中插入值?
问题解决:Mongoose数组字段无法插入数据
核心问题
你的问题根源是HTML表单的name属性命名不符合数组对象的解析规则,且未传递MaterialesProductos数组元素必需的nombre字段,导致req.body的结构无法被Mongoose识别,最终插入的数组为空。
具体原因
Mongoose要求MaterialesProductos是包含{nombre: String, cantidad: Number}对象的数组,但你的表单name="MaterialesProductos.cantidad"会被body-parser解析为:
{"MaterialesProductos": {"cantidad": [1,2,3]}}
这种结构和模型定义的数组对象完全不匹配,所以Mongoose会忽略该字段,插入空数组。
分步解决
1. 修正HTML表单的name属性
使用数组下标+属性名的命名规则,让body-parser自动解析为正确的数组对象结构,同时通过隐藏域传递nombre值:
<div class="control-group"> <div class="form-group floating-label-form-group controls"> <input type="button" name="abrirse" id="open" value="Agregar materiales"> <div id="popup" style="display: none;"> <div class="content-pop"> <div><a href="#" id="close">X</a></div> <% for (var a = 0; a < materiales.length; a++) { %> <div> <%=materiales[a].Descripcion%> <!-- 隐藏域传递nombre,对应模型的nombre字段 --> <input type="hidden" name="MaterialesProductos[<%=a%>].nombre" value="<%=materiales[a].Descripcion%>"> <!-- 数组下标+属性名,解析后成为数组元素的cantidad字段 --> <input type="number" value="0" name="MaterialesProductos[<%=a%>].cantidad" min="0"> </div> <% } %> </div> </div> </div> </div>
2. 验证req.body结构
修正后,req.body会被解析为符合模型要求的结构:
{ // 其他字段(如nombre, precio等) "MaterialesProductos": [ {"nombre": "材料A", "cantidad": 5}, {"nombre": "材料B", "cantidad": 2} ] }
此时Mongoose的create方法可以正确识别并插入数组数据。
3. 优化POST接口(可选)
添加错误处理,并过滤掉cantidad为0的无效元素,避免数据库存储冗余数据:
const Producto = require('../models/Productos.js') const fileUpload = require('express-fileupload') const path = require('path') module.exports = (req,res)=>{ console.log(req.body) // 过滤掉数量为0的材料,保留有效数据 const validMateriales = req.body.MaterialesProductos?.filter(item => item.cantidad > 0) || [] let image = req.files.image; image.mv(path.resolve(__dirname,'..','public/img',image.name),async (error)=>{ // 处理文件上传错误 if(error) { console.error(error); return res.status(500).send('文件上传失败'); } await Producto.create({ ...req.body, MaterialesProductos: validMateriales, image: '/img/' + image.name }) res.redirect('/AgregarProductos') }) }
内容的提问来源于stack exchange,提问作者Aaron Rodriguez
相关产品推荐
相关产品推荐

