GraphQL带where过滤的查询返回数据后触发Apollo错误求助
解决Apollo Client报错"Can't find field on object false"的问题
问题背景
以下是用于获取用户筹款项目的GraphQL查询:
export const MY_FUNDRAISERS_QUERY = gql` query MY_FUNDRAISERS_QUERY($skip: Int = 0, $first: Int) { allFundraisers( first: $first skip: $skip sortBy: dateCreated_ASC where: { owner: { id: "63573546187cc1edfb4f7d1c" } } ) { id name amount description goal dateCreated photo { image { publicUrlTransformed } } } } `;
该查询在GraphQL Playground中可正常执行且返回数据,但Apollo Client抛出以下错误:
Error: Can't find field 'id' on object false Can't find field 'name' on object false ...(其余字段类似错误)
其余查询和突变均正常运行,怀疑问题与where过滤条件相关。
可能的原因及解决办法
1. 确认服务器响应结构的正确性
虽然网络请求显示有数据,但需检查响应中allFundraisers的实际值是否为数组类型:
- 打开浏览器DevTools的Network面板,找到该GraphQL请求,查看Response的JSON结构:
正确的响应结构应为:
如果后端在无匹配数据时返回{ "data": { "allFundraisers": [ { "id": "xxx", "name": "xxx", // 其他字段内容 } ] } }allFundraisers: false而非空数组[],就会触发Apollo的解析错误。此时需要后端调整响应逻辑,确保该字段始终返回数组(空数据时返回[])。
2. 验证Apollo Client的缓存类型定义
Apollo Client依赖schema类型解析响应,如果客户端缓存中allFundraisers的类型被错误识别为布尔值,会导致解析失败:
- 使用Apollo Client DevTools查看Cache标签页,确认
allFundraisers的类型为[Fundraiser](Fundraiser对象数组)。 - 若使用代码生成工具(如GraphQL Codegen)生成类型,重新生成并检查
allFundraisers的类型定义是否正确;若手动维护客户端schema,确认字段类型无误。
3. 排查自定义缓存逻辑的干扰
如果为allFundraisers配置了自定义read resolver或特殊缓存策略,可能意外返回false:
- 暂时移除自定义resolver,或在
useQuery中使用fetchPolicy: 'network-only'跳过缓存测试:const { data } = useQuery(MY_FUNDRAISERS_QUERY, { variables: { skip: 0, first: 10 }, fetchPolicy: 'network-only' });
4. 调整where过滤条件的格式(针对特定后端)
部分GraphQL后端(如Prisma)在关联字段过滤时需要显式使用操作符,尝试修改where条件为:
where: { owner: { id: { equals: "63573546187cc1edfb4f7d1c" } } }
虽然Playground能正常执行,但部分后端对隐式匹配和显式匹配的处理存在差异,可尝试验证该方案。
内容的提问来源于stack exchange,提问作者Cjmaret
相关产品推荐
相关产品推荐

