登录
首页 >  文章 >  前端

Mongoose好友添加功能实现详解

时间:2025-10-05 10:18:36 136浏览 收藏

推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

本文详细讲解了如何使用 Mongoose 在 Node.js 应用中实现用户添加好友功能,并着重强调了安全性与数据一致性的重要性。文章深入探讨了处理好友请求的正确姿势,避免前端篡改,并推荐从已认证的用户信息中获取发送者 ID。同时,对比了在用户模式中维护好友数组与通过查询 FriendRequest 集合获取好友列表两种方案,推荐后者以简化数据结构。针对更新多个集合可能导致数据不一致的问题,本文还详细介绍了 Mongoose 事务的使用方法,确保好友关系变更的原子性。无论你是初学者还是经验丰富的开发者,本文都能帮助你安全、高效地实现用户好友功能,提升应用的用户体验。

在 Mongoose 中实现用户添加好友功能

本文旨在指导开发者如何在 Mongoose 中实现用户添加好友的功能,并探讨了维护用户好友关系的不同策略。重点介绍如何安全地处理好友请求,以及在用户接受好友请求后,如何正确更新用户模式中的好友数组。同时,也讨论了使用额外数组存储好友关系的必要性,并提出了更优的查询方案。

安全地处理好友请求

在处理好友请求时,安全性至关重要。不要从前端获取发送者 ID,因为这容易受到篡改。应该从已经认证的用户信息中获取发送者 ID。假设你已经创建了一个用于检查认证的中间件,可以这样修改 POST 请求处理程序:

router.post("/requests", (req, res) => {
  const { receiver } = req.body;

  // 创建一个新的 FriendRequest 实例
  const newRequest = new FriendRequest({
    sender: req.user._id, // 从认证用户获取 sender ID
    receiver,
  });

  // 将好友请求保存到数据库
  newRequest
    .save()
    .then(() => {
      // 重定向到成功页面或发送成功响应
      res.status(204).send();
    })
    .catch((error) => {
      // 适当处理错误
      res.status(500).send("Error sending friend request");
    });
});

更简洁的做法是使用 FriendRequest.create() 方法:

FriendRequest.create({
  sender: req.user._id,
  receiver
})
.then(() => {
  // 重定向到成功页面或发送成功响应
  res.status(204).send();
})
.catch((error) => {
  // 适当处理错误
  res.status(500).send("Error sending friend request");
});

更新用户模式中的好友数组 (可选,但不推荐)

虽然可以在用户模式中显式地维护一个好友数组,但这并非总是必要的。如果需要获取好友列表,可以通过查询 FriendRequest 集合来实现。

FriendRequest
  .find({sender: req.user._id, status: 'accepted'})
  .then((listOfFriends)=>{
    console.log(listOfFriends);
  })
  .catch((e)=>{
    // 处理错误
  })

如果仍然希望在用户模式中显式地维护一个好友数组,则需要在接受好友请求时更新该数组:

router.post("/requests/:id/accept", async (req, res) => {
  const request = await FriendRequest.findById(req.params.id);
  request.status = "accepted";
  await request.save();
  const currentUserId = req.user._id; // 获取当前用户的ID
  const currentUser = await User.findById(currentUserId);
  currentUser.friends.push(request.receiver);
  await currentUser.save();
  const otherUser = await User.findById(request.receiver);
  otherUser.friends.push(currentUserId);
  await otherUser.save();
  res.redirect("/requests");
});

注意事项:

  • 事务: 在两个不同的集合中进行更改(更新 FriendRequest 和 User)可能导致数据不一致。例如,如果服务器在更新 FriendRequest 后崩溃,但 User 未更新,则数据库将处于不一致状态。为了确保数据一致性,应该使用事务

使用事务确保数据一致性

为了确保数据一致性,需要使用事务。Mongoose 支持事务,可以使用 startSession() 方法启动一个会话,并在该会话中执行多个操作。如果在会话中的任何操作失败,则可以回滚所有操作。

以下是如何使用事务更新 FriendRequest 和 User 集合的示例:

const mongoose = require('mongoose');

router.post("/requests/:id/accept", async (req, res) => {
  const session = await mongoose.startSession();
  session.startTransaction();

  try {
    const request = await FriendRequest.findById(req.params.id).session(session);
    request.status = "accepted";
    await request.save({ session });

    const currentUserId = req.user._id; // 获取当前用户的ID
    const currentUser = await User.findById(currentUserId).session(session);
    currentUser.friends.push(request.receiver);
    await currentUser.save({ session });

    const otherUser = await User.findById(request.receiver).session(session);
    otherUser.friends.push(currentUserId);
    await otherUser.save({ session });

    await session.commitTransaction();
    session.endSession();
    res.redirect("/requests");
  } catch (error) {
    await session.abortTransaction();
    session.endSession();
    console.error("Transaction failed:", error);
    res.status(500).send("Error accepting friend request");
  }
});

代码解释:

  1. 启动会话: const session = await mongoose.startSession(); 启动一个新的 Mongoose 会话。
  2. 开始事务: session.startTransaction(); 开始一个事务。
  3. 执行操作: 在 try 块中,执行所有数据库操作。关键是使用 .session(session) 将会话与每个操作关联起来。
  4. 提交事务: await session.commitTransaction(); 如果所有操作都成功,则提交事务,将所有更改保存到数据库。
  5. 中止事务: await session.abortTransaction(); 如果任何操作失败,则中止事务,回滚所有更改。
  6. 结束会话: session.endSession(); 结束会话。
  7. 错误处理: 在 catch 块中,处理错误并中止事务。

总结:

  • 为了确保数据一致性,建议使用事务。
  • 在用户模式中显式维护好友数组可能不是最佳做法。可以通过查询 FriendRequest 集合来获取好友列表。
  • 始终从已认证的用户信息中获取发送者 ID,以提高安全性。

通过以上步骤,你可以安全且有效地在 Mongoose 中实现用户添加好友的功能。记住,数据一致性和安全性是至关重要的,因此请务必使用事务并验证用户输入。

理论要掌握,实操不能落!以上关于《Mongoose好友添加功能实现详解》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>