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

添加点赞至数据库时出现‘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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 07:57:06