如何禁止登录用户点赞/评论自己发布的帖子?
解决方案:禁止用户给自己的帖子点赞/评论
你的核心问题是缺少登录用户与帖子作者的ID校验逻辑,只需在点赞/评论流程最开始加入身份对比即可解决。注意Mongoose的ObjectId是对象类型,不能直接用===对比值,必须转成字符串或用equals()方法判断。
修改后的点赞接口代码
// LIKE DISLIKE router.put("/:id/like", verifyToken, async (req, res) => { try { const post = await Post.findById(req.params.id); // 拦截作者给自己点赞的请求 if (post.user.toString() === req.user._id.toString()) { return res.status(403).json("无法给自己的帖子点赞/取消点赞"); } if (!post.likes.includes(req.user._id)) { await post.updateOne({ $push: { likes: req.user._id } }); return res.status(200).json("帖子已点赞"); } else { await post.updateOne({ $pull: { likes: req.user._id } }); return res.status(200).json("帖子已取消点赞"); } } catch (error) { return res.status(500).json(error.message); } });
评论接口的同理校验逻辑
如果是评论接口,只需复制同样的校验逻辑放在评论创建前:
router.post("/:id/comment", verifyToken, async (req, res) => { try { const post = await Post.findById(req.params.id); // 拦截作者给自己评论的请求 if (post.user.equals(req.user._id)) { return res.status(403).json("无法给自己的帖子评论"); } const newComment = { user: req.user._id, profile: req.user.profile, comment: req.body.comment }; await post.updateOne({ $push: { comments: newComment } }); return res.status(200).json("评论已发布"); } catch (error) { return res.status(500).json(error.message); } });
额外修正:Schema中的拼写错误
你的Post Schema里likes字段的deafult是拼写错误,应该改为default,并且默认值建议设为空数组(因为存的是用户ID集合,不是数字):
likes:{ type:Array, default:[] }
内容的提问来源于stack exchange,提问作者ScieFi
相关产品推荐
相关产品推荐

