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

在JavaScript路由中为SQL查询添加点赞/取消点赞判断条件

实现帖子点赞/取消点赞的Toggle功能

你可以通过先查询用户是否已点赞,再根据结果执行插入或删除操作,同时同步更新post表的点赞计数。以下是具体实现:

核心逻辑实现

router.post("/like", (req, res) => {
    const userLiking = req.body.userLiking;
    const postid = req.body.postid;

    // 第一步:检查用户是否已点赞该帖子
    db.query(
        "SELECT 1 FROM likes WHERE userLiking = ? AND postid = ?",
        [userLiking, postid],
        (err, results) => {
            if (err) {
                console.error(err);
                return res.status(500).json({ error: "数据库查询失败" });
            }

            const hasLiked = results.length > 0;

            if (hasLiked) {
                // 已点赞:执行取消点赞逻辑
                // 1. 删除点赞记录
                db.query(
                    "DELETE FROM likes WHERE userLiking = ? AND postid = ?",
                    [userLiking, postid],
                    (deleteErr) => {
                        if (deleteErr) {
                            console.error(deleteErr);
                            return res.status(500).json({ error: "取消点赞失败" });
                        }
                        // 2. 帖子点赞数减1
                        db.query(
                            "UPDATE post SET likes = likes - 1 WHERE id = ?",
                            postid,
                            (updateErr) => {
                                if (updateErr) {
                                    console.error(updateErr);
                                    return res.status(500).json({ error: "更新点赞数失败" });
                                }
                                res.json({ success: true, action: "unliked" });
                            }
                        );
                    }
                );
            } else {
                // 未点赞:执行添加点赞逻辑
                // 1. 插入点赞记录
                db.query(
                    "INSERT INTO likes (userLiking, postid) VALUES(?,?)",
                    [userLiking, postid],
                    (insertErr) => {
                        if (insertErr) {
                            console.error(insertErr);
                            return res.status(500).json({ error: "添加点赞失败" });
                        }
                        // 2. 帖子点赞数加1
                        db.query(
                            "UPDATE post SET likes = likes + 1 WHERE id = ?",
                            postid,
                            (updateErr) => {
                                if (updateErr) {
                                    console.error(updateErr);
                                    return res.status(500).json({ error: "更新点赞数失败" });
                                }
                                res.json({ success: true, action: "liked" });
                            }
                        );
                    }
                );
            }
        }
    );
});

关键优化建议

  • 添加数据库层面约束:在likes表上创建userLiking和postid的联合唯一索引,避免同一用户重复点赞:
    CREATE UNIQUE INDEX idx_user_post ON likes(userLiking, postid);
    
  • 使用事务保证原子性:如果需要确保点赞记录和帖子点赞数的操作要么都成功、要么都失败,可以开启数据库事务(以MySQL为例):
    db.beginTransaction((err) => {
        if (err) {
            console.error(err);
            return res.status(500).json({ error: "事务开启失败" });
        }
        // 执行插入/删除 + 更新操作
        // 操作成功调用db.commit(),失败调用db.rollback()
    });
    
  • 用async/await简化代码:避免回调嵌套,提升代码可读性:
    router.post("/like", async (req, res) => {
        try {
            const userLiking = req.body.userLiking;
            const postid = req.body.postid;
    
            const [likeExists] = await db.query(
                "SELECT 1 FROM likes WHERE userLiking = ? AND postid = ?",
                [userLiking, postid]
            );
    
            if (likeExists.length > 0) {
                await db.query("DELETE FROM likes WHERE userLiking = ? AND postid = ?", [userLiking, postid]);
                await db.query("UPDATE post SET likes = likes - 1 WHERE id = ?", postid);
                return res.json({ success: true, action: "unliked" });
            } else {
                await db.query("INSERT INTO likes (userLiking, postid) VALUES(?,?)", [userLiking, postid]);
                await db.query("UPDATE post SET likes = likes + 1 WHERE id = ?", postid);
                return res.json({ success: true, action: "liked" });
            }
        } catch (err) {
            console.error(err);
            res.status(500).json({ error: "操作失败" });
        }
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:25:19