基于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
相关产品推荐
相关产品推荐

