使用Node和Mongoose无法将元素保存至嵌套对象数组的问题
问题分析与修复方案
核心问题点及修复:
异步操作未等待,提前返回响应
你代码里的res.render("homeAdmin")写在了User.findOne的回调外部,而且item.save()是异步操作,没有等待它完成就跳转页面,导致数据库还没完成保存,页面刷新后数组看起来还是空的。必须把响应操作放在保存完成之后。save操作位置不当
把item.save()放在循环里可能导致多次触发保存,找到对应宠物后应该跳出循环,再执行保存操作。日期格式错误
Date()返回的是字符串,MongoDB更适合存储Date对象,改成new Date()更规范。缺少错误处理
没有处理用户查找失败、保存失败的情况,需要添加catch捕获异常。
修改后的代码:
app.post("/addVisit", async function(req, res) { try { const newVisit = new Visit({ CC: req.body.CC, history: req.body.history, physical: req.body.physical, tests: req.body.tests, DD: req.body.DD, treatment: req.body.treatment, date: new Date(), // 改为Date对象 doctor: currentUser }); console.log("A new visit for " + req.body.petName + " ", newVisit); const user = await User.findOne({ email: req.body.email }); if (!user) { console.log("用户未找到"); return res.render("homeAdmin"); // 或其他错误处理 } // 找到对应宠物并添加就诊记录 const targetPet = user.pets.find(pet => pet.name === req.body.petName); if (targetPet) { targetPet.clinicVisits.push(newVisit); console.log("就诊记录已添加"); await user.save(); // 等待保存完成 console.log("数据已保存"); } else { console.log("未找到对应宠物"); } res.render("homeAdmin"); // 保存完成后再跳转 } catch (err) { console.error("操作出错:", err); res.render("homeAdmin"); // 或错误页面 } });
另外还要确认你的User模型中,pets字段的clinicVisits是定义为数组类型,比如:
const userSchema = new mongoose.Schema({ // 其他字段... pets: [{ name: String, // 其他宠物字段... clinicVisits: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Visit' }] // 或者如果是嵌套文档的话: // clinicVisits: [visitSchema] }] });
内容的提问来源于stack exchange,提问作者Yan Lavy
相关产品推荐
相关产品推荐

