如何在PostgreSQL+Node.js中实现帖子点赞与取消点赞功能
解决点赞/取消点赞功能异常问题
核心问题分析
你的createLike函数逻辑存在漏洞:当检测到已有点赞并执行删除操作后,没有终止后续代码,导致紧接着又创建了一条新的点赞记录,所以看起来“无法取消点赞”。
修正后的请求处理函数
const createLike = async (obj) => { const like = await Likes.findOne({ where: { userId: obj.userId, postId: obj.postId } }) if (like) { await like.destroy(); return { status: 'cancelled', message: '点赞已取消' }; } const data = await Likes.create({ id: uuid.v4(), userId: obj.userId, postId: obj.postId }); return { status: 'created', data }; }
额外优化建议
为了避免数据库层面出现重复点赞的情况,建议给Likes模型添加userId和postId的联合唯一约束:
const Likes = db.define('likes', { id: { type: DataTypes.UUID, primaryKey: true }, userId: { type: DataTypes.UUID, allowNull: false, references: { key: 'id', model: Users } }, postId: { type: DataTypes.UUID, allowNull: false, references: { key: 'id', model: Posts } } }, { indexes: [ { unique: true, fields: ['userId', 'postId'] } ] });
补充说明
- 修正后的逻辑:先检查用户是否已点赞该帖子,存在则删除(取消点赞)并返回取消状态;不存在则创建新点赞并返回创建结果。
- 联合唯一约束能从数据库层面保证同一用户无法对同一帖子重复点赞,避免业务逻辑之外的异常数据。
内容的提问来源于stack exchange,提问作者Mica Carballo
相关产品推荐
相关产品推荐

