MongoDB数据不一致:添加评论至集合数组后数据库未更新
问题分析与解决方案
嗨,我一眼就发现问题所在啦!你已经成功把评论对象加到内存里的campground文档数组中了,但忘了把这个变更保存回MongoDB数据库——这就是为什么console.log能看到数组更新,但数据库里的comments还是空的原因!
问题根源
Mongoose返回的文档对象(比如这里的campComm)是内存中的副本,你对它做的修改(比如push新评论)只会在内存中生效,不会自动同步到数据库。必须显式调用save()方法,才能把内存中的变更持久化到MongoDB里。
修正后的代码
我把你的代码补上关键的保存步骤,同时完善了错误处理:
app.post('/campgrounds/:id/comments', function(req, res){ Camp.findById(req.params.id, function(err, campComm){ if(err){ console.log(err); res.redirect('/campgrounds'); } else { Comment.create(req.body.comment, function(err, comm){ if(err){ console.log(err); } else { campComm.comments.push(comm); // 核心步骤:调用save方法将变更同步到数据库 campComm.save(function(err, updatedCamp){ if(err){ console.log(err); } else { console.log("数据库已更新:", updatedCamp); res.redirect('/campgrounds/' + req.params.id); // 跳转到营地详情页 } }); } }); } }); });
进阶优化:用async/await简化代码
嵌套回调看起来有点杂乱,如果你用ES6的async/await写法,代码会更清晰易读:
app.post('/campgrounds/:id/comments', async function(req, res){ try { // 1. 找到目标营地 const campComm = await Camp.findById(req.params.id); // 2. 创建新评论 const comm = await Comment.create(req.body.comment); // 3. 添加评论到数组并保存到数据库 campComm.comments.push(comm); await campComm.save(); // 4. 跳转回营地详情页 res.redirect('/campgrounds/' + req.params.id); } catch(err) { console.log(err); res.redirect('/campgrounds'); } });
内容的提问来源于stack exchange,提问作者dhia messaoudi
相关产品推荐
相关产品推荐

