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

Apollo GraphQL访问嵌套字段报TypeError is undefined如何解决

问题根因

你的GraphQL查询写法没有问题,报错是因为对返回的数据结构理解错了:

  • data.category.products是商品对象构成的数组,不是单个商品对象,数组本身不存在prices属性,直接访问data.category.products.prices得到的就是undefined,再调用.map()自然会抛出类型错误。
  • 你写的遍历data.category.products的代码能正常运行,刚好也能证明products是数组类型。

另外你当前的代码还有一个隐藏问题:useQuery在请求发出的初始阶段、还没拿到返回结果时,data的值是undefined,这时候直接访问data.category也会抛错,必须做加载状态判断或者防御性访问。

修复方案

需要两层遍历:先遍历products数组拿到单个商品对象,再遍历单个商品下的prices数组,同时补上加载、错误状态处理:

export default function App() {
  const { data, loading, error } = useQuery(QUERIES)

  if (loading) return <div>加载中...</div>
  if (error) return <div>请求失败:{error.message}</div>

  return (
    <div className="App">
      {data.category.products.map((product) => (
        <div key={product.id}>
          <p>商品ID:{product.id}</p>
          {/* 遍历当前商品的价格列表 */}
          {product.prices.map((price, index) => (
            <p key={index}>
              {price.currency.label} {price.amount}
            </p>
          ))}
        </div>
      ))}
    </div>
  );
}
补充说明

如果不想单独写加载判断,也可以用可选链操作符做防御性访问,避免请求未完成时的空指针报错:

{data?.category?.products?.map((product) => (
  // 内部遍历prices的逻辑不变
))}

你在GraphQL Playground中执行查询不报错,是因为Playground拿到的是请求完成后的完整响应,你可以展开返回结果看结构,就能直观看到products是数组、prices是每个数组项的子字段,和你写的查询逻辑无关。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:57:20