添加点赞至数据库时出现‘User matching query does not exist’错误排查
问题:点赞功能创建记录失败,后端返回"User matching query does not exist"且user_id为null
我正在开发基于多对多关系的点赞按钮功能:用户点赞某篇verse(帖子)时数据库添加点赞记录,取消点赞时删除对应记录。目前取消点赞功能deleteUserLike可正常工作,但创建点赞时前端无法成功触发,后端返回User matching query does not exist错误,且开发者工具网络面板显示请求payload里的user_id为null。
补充:尝试将事件处理函数中的userId改为user.id,控制台能正确显示当前用户ID,但问题仍未解决。
相关代码
VerseCard组件代码
const handleCheckChange = (event) => { const { checked } = event.target; if (checked) { createUserLike({ verseId: id, ...userId }); console.warn(userId); } else { const userLike = userLikesArray.find((ul) => ul.verse_id === id); if (userLike) { deleteUserLike(userLike.id); } } }; return ( <> <Card className="text-center" style={{ width: '25rem' }}> <Card.Header>{firstName} {lastName}</Card.Header> <Card.Body> <Card.Title>{verse}</Card.Title> <Card.Text>{content}</Card.Text> <Card.Footer>{version}</Card.Footer> <div style={{ margin: 'auto', display: 'block', width: 'fit-content', }} > <FormControlLabel control={( <Checkbox icon={<FavoriteBorder />} checkedIcon={<Favorite />} name="checkedH" checked={!!userLikesArray.find((ul) => id === ul.verse_id)} onChange={handleCheckChange} /> )} />
userLikeData请求代码
const createUserLike = (userLike) => { const userLikeObj = { verse_id: Number(userLike.verseId), user_id: Number(userLike.userId), }; return fetch(`${clientCredentials.databaseURL}/userlikes`, { method: 'POST', body: JSON.stringify(userLikeObj), headers: { 'Content-Type': 'application/json', }, }) .then((response) => response.json()); };
Django后端user_like视图代码
def create(self, request): user = User.objects.get(id=request.data["user_id"]) verse = Verse.objects.get(pk=request.data["verse_id"]) user_like = UserLike.objects.create( verse=verse, user=user ) serializer = UserLikeSerializer(user_like) return Response(serializer.data)
问题分析与解决
1. 核心问题:前端参数传递错误
你调用createUserLike时用了...userId,如果userId是数字类型(比如用户ID是123),展开运算符会把它当成索引对象处理,最终传递的参数里根本没有userId字段。哪怕改成user.id,直接展开数字也不会生成合法的userId属性,导致后端接收到的user_id为null。
修复代码:
// 原代码 createUserLike({ verseId: id, ...userId }); // 修改为 createUserLike({ verseId: id, userId: user.id });
2. 后端优化:添加错误防御
当前后端直接用User.objects.get(),若user_id为null或不存在会直接抛出异常。可以添加基础校验避免崩溃:
from rest_framework import status def create(self, request): user_id = request.data.get("user_id") verse_id = request.data.get("verse_id") # 校验必填参数 if not user_id or not verse_id: return Response({"error": "缺少user_id或verse_id参数"}, status=status.HTTP_400_BAD_REQUEST) # 捕获查询不存在的异常 try: user = User.objects.get(id=user_id) verse = Verse.objects.get(pk=verse_id) except (User.DoesNotExist, Verse.DoesNotExist): return Response({"error": "用户或帖子不存在"}, status=status.HTTP_404_NOT_FOUND) user_like = UserLike.objects.create(verse=verse, user=user) serializer = UserLikeSerializer(user_like) return Response(serializer.data)
3. 可选:前端参数类型校验
确保user.id是有效数字,可在请求函数里做防御性处理:
const userLikeObj = { verse_id: Number(userLike.verseId) || null, user_id: Number(userLike.userId) || null, };
内容的提问来源于stack exchange,提问作者Soothingcube3
相关产品推荐
相关产品推荐

