如何防止用户关注自己:修复 MongoDB 用户关注逻辑中的对象比较错误

夜宇吖_5225

夜宇吖_5225

2026-08-08

446人浏览

原创

如何防止用户关注自己:修复 MongoDB 用户关注逻辑中的对象比较错误

本文详解为何直接用 === 比较两个 mongoose 文档对象无法判断是否为同一用户,并提供安全、高效的身份校验方案,同时说明 http 方法选型建议。

本文详解为何直接用 === 比较两个 mongoose 文档对象无法判断是否为同一用户,并提供安全、高效的身份校验方案,同时说明 http 方法选型建议。

在实现用户关注(follow)与取关(unfollow)功能时,一个关键的安全约束是:禁止用户关注自己。然而,许多开发者会误以为通过 userToModify === currentUser 即可完成身份比对——这是典型的常见误区。

❌ 错误做法:直接比较对象引用

Mongoose 的 User.findById() 返回的是独立的文档实例(即不同内存地址的对象),即使它们对应数据库中同一条记录(如 id 相同),其 JavaScript 引用也永远不相等:

if (userToModify === currentUser) { // ❌ 总是 false!
  return res.status(400).json({ message: "You cannot follow/unfollow yourself!" });
}

该条件永远不会触发,导致逻辑失效,用户可成功“关注自己”。

讯飞智文
讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

下载

✅ 正确做法:比较唯一标识符(_id)

应始终使用数据库主键(即 _id 字段值)进行语义级比对。由于 req.params.id 和 req.user._id 均为字符串或 ObjectId 类型,二者可直接安全比较:

const { id } = req.params;

// ✅ 在查询前就校验,避免无谓 DB 请求
if (id.toString() === req.user._id.toString()) {
  return res.status(400).json({ message: "You cannot follow/unfollow yourself!" });
}

// 后续再执行查询
const userToModify = await User.findById(id);
const currentUser = await User.findById(req.user._id);

if (!userToModify || !currentUser) {
  return res.status(404).json({ message: "User not found!" });
}

? 优化提示:将 ID 校验提前至数据库查询之前,既提升性能,又增强健壮性(避免空查询 + 提前失败)。

? 关注/取关核心逻辑(精简版)

const isFollowing = currentUser.following.includes(id);

if (isFollowing) {
  // 取关:双向移除关联
  await User.findByIdAndUpdate(id, { $pull: { followers: req.user._id } });
  await User.findByIdAndUpdate(req.user._id, { $pull: { following: id } });
  res.status(200).json({ message: "User unfollowed successfully" });
} else {
  // 关注:双向添加关联
  await User.findByIdAndUpdate(id, { $push: { followers: req.user._id } });
  await User.findByIdAndUpdate(req.user._id, { $push: { following: id } });
  res.status(200).json({ message: "User followed successfully" });
}

⚠️ 注意事项与最佳实践

  • 类型一致性:确保 id 和 req.user._id 类型一致。推荐统一转为字符串比对(.toString()),避免 ObjectId 实例比较陷阱。
  • 原子性考虑:当前实现为两个独立更新操作,极端情况下可能出现数据不一致(如第一个成功、第二个失败)。生产环境建议使用事务(session)包裹。
  • HTTP 方法选型:
    使用 POST 是可行的(尤其当接口语义为“触发状态切换”时),但更符合 REST 规范的做法是:
    • ✅ 使用 PATCH /users/:id/follow 表示修改关注状态(幂等、语义清晰);
    • ❌ 避免 PUT(通常用于全量替换资源);
    • ? 不适用 GET 或 DELETE(副作用操作不应通过 GET 触发)。

✅ 总结

防止用户关注自己的本质,不是比较对象引用,而是校验业务主键。务必使用 id.toString() === req.user._id.toString() 进行前置判断,并将该检查置于任何数据库操作之前。同时,结合合理的 HTTP 方法设计与错误处理,才能构建出健壮、可维护的关注系统。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mongodb

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

735

5

mongodb启动命令
mongodb启动命令

MongoDB 是一种开源的、基于文档的 NoSQL 数据库管理系统。本专题提供mongodb启动命令的文章,希望可以帮到大家。

2023.08.08

2494

5

MongoDB删除数据的方法
MongoDB删除数据的方法

MongoDB删除数据的方法有删除集合中的文档、删除整个集合、删除数据库和删除指定字段等。本专题为大家提供MongoDB相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.19

2344

5

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4269

19

mongodb有哪些应用领域
mongodb有哪些应用领域

mongodb 的应用领域涵盖广泛,包括内容管理系统、社交媒体、分析、移动应用、物联网、金融科技、医疗保健和广告技术等领域,因其灵活性、可扩展性和易用性而广受欢迎。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

958

6

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6772

6

mongodb安装失败如何彻底删除
mongodb安装失败如何彻底删除

彻底删除 mongodb 安装失败的步骤:1、停止和禁用 mongodb 服务;2、删除配置文件、数据目录和日志文件;3、删除 mongodb 二进制文件;4、卸载 mongodb 套件(如果通过软件包管理器安装);5、删除 mongodb 用户、组和目录;6、重启系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

595

6

mongodb与mysql好用推荐
mongodb与mysql好用推荐

mongodb 适用于非结构化数据、高扩展性和灵活查询(如网站内容管理、社交媒体),而 mysql 适用于结构化数据、强数据一致性和联接查询(如电子商务、银行系统)。

2024.04.02

2009

9

mongodb数据库的优势有哪些
mongodb数据库的优势有哪些

mongodb 数据库以其灵活、可扩展和高性能而闻名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

2251

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 6.3万人学习

黑马云课堂mongodb实操视频教程
黑马云课堂mongodb实操视频教程

共11课时 | 3.5万人学习

MongoDB 教程
MongoDB 教程

共42课时 | 61.4万人学习