MongoDB更新帖子报错Cannot read properties of null (reading 'updateOne')如何解决
报错原因分析
Cannot read properties of null (reading 'updateOne')的触发原因是Post.findById(req.params.id)未查询到对应ID的帖子数据,返回了null,你的代码未对空查询结果做校验,直接调用null.updateOne导致报错。
存在的其他问题
- 你注释了try/catch异常捕获逻辑,数据库查询、更新过程中任何异常都会直接抛出,无法正常返回错误响应,严重时会导致服务崩溃
- 未对传入的ID格式合法性做校验,不符合MongoDB ObjectId格式的ID会直接导致查询失败
修复后的更新接口代码
//Update Post router.put("/:id", async (req, res) => { try { const post = await Post.findById(req.params.id); // 新增空值判断 if (!post) { return res.status(404).json("待更新的帖子不存在"); } if (post.userId === req.body.userId) { await post.updateOne({ $set: req.body }); res.status(200).json("帖子更新成功"); } else { res.status(403).json("你没有权限更新该帖子"); } } catch (error) { res.status(500).json("服务内部错误"); } }) module.exports = router;
可选优化方案
如果你不需要先查询帖子做额外逻辑校验,也可以直接调用Post.findByIdAndUpdate方法,减少一次数据库查询开销,代码如下:
router.put("/:id", async (req, res) => { try { const updatedPost = await Post.findByIdAndUpdate( req.params.id, { $set: req.body }, { new: true } // 配置返回更新后的文档 ); if (!updatedPost) { return res.status(404).json("待更新的帖子不存在"); } res.status(200).json(updatedPost); } catch (error) { res.status(500).json("服务内部错误"); } })
注意:该优化方案需要在更新前自行增加userId权限校验,避免越权更新他人帖子
内容的提问来源于stack exchange,提问作者Madan
相关产品推荐
相关产品推荐

