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

Apollo MERN项目读取GraphQL数据出现undefined错误求助

Apollo MERN项目中useQuery返回data始终为undefined的问题

问题现象

开发Apollo MERN Web项目时,尝试打印GraphQL返回数据触发错误:Uncaught TypeError: Cannot read properties of undefined (reading 'project')。添加加载/错误状态判断后错误消失,但始终无法获取请求数据,控制台打印data一直为undefined。已尝试添加skip: !params.id和状态判断,问题依旧。

相关代码

ProjectDetails.jsx

import { useParams } from "react-router-dom";
import { useQuery } from "@apollo/client";
import { GET_PROJECT } from "../graphql/projects";

export function ProjecDetails() {
  const params = useParams();
  const { data, loading, error } = useQuery(GET_PROJECT, {
    variables: {
      id: params.id,
    },
  });

  console.log(data)

  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error</p>; 
  
  return <div>
   <h1>{data.project.name}</h1>
    <p>{data.project.description}</p>
    <button>Update</button>
  </div>;
}

GraphQL配置代码

import { gql } from "@apollo/client";

export const GET_PROJECTS = gql`
  {
    projects {
      _id
      name
      description
    }
  }
`;

export const GET_PROJECT = gql`
  query ($id: ID!) {
    project(_id: $id) {
      _id
      name
      description
      createdAt
      tasks {
        _id
        title
      }
    }
  }
`;

export const CREATE_PROJECT = gql`
  mutation ($name: String, $description: String) {
    createProject(name: $name, description: $description) {
      _id
      name
      description
    }
  }
`;

控制台输出

Download the Apollo DevTools for a better development experience: https://chrome.google.com/webstore/detail/apollo-client-developer-t/jdkknkkbebbapilgoeccciglkfbmbnfm
ProjectDetails.jsx:32 undefined
installHook.js:1608 undefined
ProjectDetails.jsx:32 undefined
installHook.js:1608 undefined

排查与解决步骤

1. 核对GraphQL服务端参数名

检查服务端project查询的接收参数是_id还是id。如果服务端Resolver定义的参数为id(示例如下),客户端查询需将_id: $id改为id: $id:

// 服务端Resolver示例
project: async (parent, { id }) => {
  // 数据库查询逻辑
}

修正后的客户端查询:

query ($id: ID!) {
  project(id: $id) {
    _id
    name
    description
    createdAt
    tasks {
      _id
      title
    }
  }
}

2. 验证params.id有效性

在组件中打印params.id确认是否拿到正确的ID值:

console.log("当前ID:", params.id);

若params.id为undefined,需确保路由配置正确传递了ID参数,同时保留skip: !params.id避免无效查询:

const { data, loading, error } = useQuery(GET_PROJECT, {
  variables: { id: params.id },
  skip: !params.id,
});

3. 排查服务端Resolver逻辑

确认服务端project Resolver能根据传入ID正确返回数据,检查:

  • 数据库查询语句是否正确
  • ID格式是否匹配(如MongoDB的ObjectId格式是否合法)
  • 是否有权限限制导致数据无法返回

4. 处理数据为空的边界情况

即使查询成功,也可能因ID不存在导致data.project为null,需添加额外判断:

if (!data?.project) return <p>项目不存在</p>;

5. 用Apollo DevTools分析请求详情

通过Apollo DevTools查看:

  • 查询是否成功发送到服务端
  • 服务端返回的响应结构是否与客户端预期一致
  • 是否存在未捕获的错误信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:18:13