Node.js+Mongoose中updateMany失效:如何同步更新旧帖子作者名
问题分析:更新用户姓名后旧帖子作者名未同步的问题
我正在搭建一个博客,用户的全名为帖子显示的作者名。希望在用户更新个人资料中的姓名时,同步更新该用户所有旧帖子的作者名。目前我能成功更新用户资料,但旧帖子的作者名并未同步更新。
我的代码如下:
router('/:id', async (req, res) { if (req.body._id == req.params.id) { try { const user = await User.find(req.params.id): let oldfirstName = user.firstname; let oldlastName = user.lastname; const author = oldfirstName + ' ' + oldlastName; const postsByUser = await Post.find({ author: author }); // gets posts by same user const updatedUser = await User.findByIdAndUpdate(req.params.id, { { $set: { firstname: req.body.firstname, lastname: req.body.lastname, } } }); let updatedAuthor = updatedUser.firstname + ' ' + updatedUser.lastname; await postsByUser.updateMany({}, { author: updatedAuthor }); }); res.status(200).json(); } catch (err) { res.status(500).json(); } }
代码中的错误点:
- 用户查询方法错误:
User.find(req.params.id)返回的是文档数组,应该用User.findById(req.params.id)获取单个用户;同时结尾的标点是中文冒号,要改成英文分号。 - findByIdAndUpdate 参数与返回值问题:
- 第二个参数多嵌套了一层大括号,正确格式是
{ $set: {...} }; - 默认
findByIdAndUpdate返回更新前的文档,需要添加{ new: true }选项才能拿到更新后的用户数据,否则updatedAuthor还是旧名字。
- 第二个参数多嵌套了一层大括号,正确格式是
- 帖子批量更新方法错误:
postsByUser是Post.find()返回的文档数组,数组没有updateMany()方法,应该直接调用Post.updateMany()来批量更新符合条件的帖子。 - 语法与结构错误:
try块的闭合括号位置错误,res.status(200).json()应该放在try内部,否则无论操作成功与否都会返回200状态码;同时路由未指定请求方法(如PUT/PATCH),回调函数的括号也不完整。
修正后的代码:
// 指定请求方法为PUT(更新资源) router.put('/:id', async (req, res) => { if (req.body._id === req.params.id) { try { // 获取旧用户数据 const user = await User.findById(req.params.id); const oldAuthor = `${user.firstname} ${user.lastname}`; // 更新用户资料,获取更新后的用户数据 const updatedUser = await User.findByIdAndUpdate( req.params.id, { $set: { firstname: req.body.firstname, lastname: req.body.lastname } }, { new: true } // 关键选项:返回更新后的文档 ); const updatedAuthor = `${updatedUser.firstname} ${updatedUser.lastname}`; // 批量更新该用户的所有帖子作者名 await Post.updateMany( { author: oldAuthor }, { $set: { author: updatedAuthor } } ); res.status(200).json({ message: "用户资料与帖子作者名已同步更新" }); } catch (err) { res.status(500).json({ error: err.message }); } } else { res.status(403).json({ message: "无权修改该用户资料" }); } });
内容的提问来源于stack exchange,提问作者mjosh
相关产品推荐
相关产品推荐

