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不一样
排查步骤
- 先在控制台确认
response.data是包含多个元素的数组,而不是单个对象 - 检查
createNode是不是在循环里调用的,而不是只调用了一次 - 运行
gatsby develop后,访问http://localhost:8000/___graphql,用allCustomDataType(替换成你自己的节点类型)查询,看看返回的nodes数组长度是不是和API返回的一致
如果按照上面的步骤改完,应该就能解决GraphQL只返回一条结果的问题啦~
内容的提问来源于stack exchange,提问作者AndrewB
相关产品推荐
相关产品推荐

