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

Gatsby中GraphQL查询Rest API仅返回单个结果的求助

嘿,我看你在Gatsby里用Rest API导入数据时,遇到了GraphQL查询只返回一条结果的问题——我刚上手Gatsby的时候也踩过几乎一模一样的坑,咱们来一步步捋清楚问题出在哪~

核心问题大概率是「节点创建时重复使用了同一个ID」

Gatsby的节点系统依赖唯一的id来区分不同节点,如果你的代码里给所有数据都用了同一个id,或者只给第一条数据创建了节点,那最后GraphQL里就只会剩下一条结果。

从你给出的代码片段看,你只写到了console.log(res.data),没看到创建节点的逻辑,我猜你可能是没遍历整个数据数组,或者创建节点时id重复了。

修正后的完整代码示例

我给你写一个标准的从Rest API导入数据并创建节点的模板,你可以对照着改:

const axios = require('axios');

exports.sourceNodes = async ({ boundActionCreators, createNodeId }) => {
  const { createNode } = boundActionCreators;
  // 替换成你的实际API地址
  const apiUrl = 'https://your-rest-api-endpoint.com/data';

  try {
    // 获取API数据
    const response = await axios.get(apiUrl);
    const dataArray = response.data;

    // 先确认控制台打印的是数组,不是单个对象
    console.log('API返回的数据数组:', dataArray);

    // 遍历每一条数据,为每条数据创建独立节点
    dataArray.forEach((item, index) => {
      // 生成唯一ID:优先用数据自带的id字段,没有的话用index+类型名生成
      const nodeId = createNodeId(`custom-data-type-${item.id || index}`);

      // 为当前item创建Gatsby节点
      createNode({
        // 把API返回的所有字段都挂载到节点上
        ...item,
        // 必须的节点属性
        id: nodeId,
        parent: null,
        children: [],
        internal: {
          // 自定义节点类型,GraphQL查询时要用这个(比如allCustomDataType)
          type: 'CustomDataType',
          // 生成内容摘要,用来判断数据是否更新,必须唯一
          contentDigest: require('crypto')
            .createHash('md5')
            .update(JSON.stringify(item))
            .digest('hex'),
        },
      });
    });
  } catch (error) {
    console.error('获取API数据或创建节点出错:', error);
  }
};

几个必须注意的关键点

  • 必须遍历整个数据数组:确认response.data是包含多个元素的数组(不是单个对象),并且用forEach循环给每一项都调用createNode
  • ID必须唯一:绝对不能所有节点用同一个id,否则后面的节点会覆盖前面的,最后只剩一条
  • contentDigest要正确生成:它是基于每条item的内容生成的哈希值,Gatsby靠它来缓存节点,必须保证每个节点的contentDigest不一样

排查步骤

  1. 先在控制台确认response.data是包含多个元素的数组,而不是单个对象
  2. 检查createNode是不是在循环里调用的,而不是只调用了一次
  3. 运行gatsby develop后,访问http://localhost:8000/___graphql,用allCustomDataType(替换成你自己的节点类型)查询,看看返回的nodes数组长度是不是和API返回的一致

如果按照上面的步骤改完,应该就能解决GraphQL只返回一条结果的问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:42:51