You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Node.js和MySQL开发好友添加系统的技术实现咨询

完整实现好友添加功能的代码与逻辑说明

看起来你已经迈出了第一步——查询目标用户是否存在,接下来咱们把这个功能补全,确保覆盖用户不存在、已是好友、添加成功这些核心场景,同时做好错误处理。假设你用的是Node.js的mysql模块,当前登录用户的UID存在currentUserUid变量中,完整代码如下:

// 假设currentUserUid是当前登录用户的UID(实际开发中从登录态获取,比如session或JWT)
// friendToAddUid是用户从文本框输入的目标UID
const currentUserUid = "当前用户的UID";
const friendToAddUid = "用户输入的目标UID";

// 第一步:查询目标用户是否存在
connection.query("SELECT uid FROM users WHERE uid = ?", [friendToAddUid], function(err, userRows) {
  if (err) {
    // 处理数据库查询错误
    console.error("查询用户信息失败:", err);
    return res.status(500).send("服务器内部错误"); // 假设用Express返回前端响应
  }

  // 目标用户不存在的情况
  if (userRows.length === 0) {
    return res.status(404).send("目标用户不存在");
  }

  // 第二步:检查是否已经是好友(覆盖双向关系:我加他/他加我)
  const checkFriendSql = `
    SELECT uid FROM friend_relations 
    WHERE (ownerUid = ? AND friendUid = ?) 
       OR (ownerUid = ? AND friendUid = ?)
  `;
  const checkParams = [currentUserUid, friendToAddUid, friendToAddUid, currentUserUid];
  
  connection.query(checkFriendSql, checkParams, function(err, friendRows) {
    if (err) {
      console.error("查询好友关系失败:", err);
      return res.status(500).send("服务器内部错误");
    }

    // 已经是好友的情况
    if (friendRows.length > 0) {
      return res.status(400).send("你们已经是好友了");
    }

    // 第三步:添加好友关系(这里按单向发起添加,若需双向好友可插入两条记录)
    const addFriendSql = "INSERT INTO friend_relations (ownerUid, friendUid) VALUES (?, ?)";
    const addParams = [currentUserUid, friendToAddUid];
    
    connection.query(addFriendSql, addParams, function(err, result) {
      if (err) {
        console.error("添加好友失败:", err);
        return res.status(500).send("添加好友失败");
      }

      // 添加成功
      res.status(200).send("好友添加成功");
    });
  });
});

关键逻辑说明

  • 错误处理:每一步数据库操作都加了错误捕获,避免因为数据库异常导致服务崩溃,同时给前端返回明确的错误提示。
  • 好友关系检查:因为好友关系可能是双向的(A加B或B加A),所以查询时覆盖了两种情况,避免重复添加。
  • 数据安全性:全程使用参数化查询(?占位符),防止SQL注入攻击,这是后端开发必须注意的安全点。
  • 业务扩展性:如果你的业务需要好友验证(比如对方同意后才成为好友),可以在好友关系表加一个status字段(比如pending/accepted),第一步插入时设为pending,后续再处理同意逻辑。

额外优化建议

可以把数据库操作封装成Promise或async/await形式,避免回调地狱,让代码更易读:

// 示例:用async/await重构
async function addFriend(currentUserUid, friendToAddUid) {
  try {
    // 查询目标用户
    const [userRows] = await connection.promise().query("SELECT uid FROM users WHERE uid = ?", [friendToAddUid]);
    if (userRows.length === 0) throw new Error("目标用户不存在");

    // 检查好友关系
    const checkSql = `SELECT uid FROM friend_relations WHERE (ownerUid = ? AND friendUid = ?) OR (ownerUid = ? AND friendUid = ?)`;
    const [friendRows] = await connection.promise().query(checkSql, [currentUserUid, friendToAddUid, friendToAddUid, currentUserUid]);
    if (friendRows.length > 0) throw new Error("你们已经是好友了");

    // 添加好友
    await connection.promise().query("INSERT INTO friend_relations (ownerUid, friendUid) VALUES (?, ?)", [currentUserUid, friendToAddUid]);
    return "好友添加成功";
  } catch (err) {
    console.error("添加好友出错:", err);
    throw err;
  }
}

内容的提问来源于stack exchange,提问作者Nik Hendricks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:31:44