apollo graphql查询服务重复收集项目?
Posted
技术标签:
【中文标题】apollo graphql查询服务重复收集项目?【英文标题】:Apollo GraphQL query in service duplicates collection items? 【发布时间】:2020-01-05 18:13:12 【问题描述】:我的 Angular 6 应用程序的服务中有以下方法;
public getPupilReport(): Observable<PupilReport>
return this.apollo.query<any>(
query: gql`
query query
pupilReports
new
date
pupilReportTemplateId
pupilReportTemplate
id
name
sortedPupilAttributeCollections
sortOrder
pupilAttributeCollection
id
name
sortedPupilAttributes
sortOrder
pupilAttribute
id
name
type
`,
)
.pipe(map(result =>
var pupilReport = new PupilReport();
if (result && result.data.pupilReports.new)
pupilReport = result.data.pupilReports.new;
return pupilReport;
));
当我使用 GraphIQL 运行上面的查询时,我会返回以下数据;
"data":
"pupilReports":
"new":
"date": "0001-01-01",
"pupilReportTemplateId": 0,
"pupilReportTemplate":
"id": 99,
"name": "KS3 Science",
"sortedPupilAttributeCollections": [
"sortOrder": 1,
"pupilAttributeCollection":
"id": 1,
"name": "Attainment",
"sortedPupilAttributes": [
"sortOrder": 1,
"pupilAttribute":
"id": 1,
"name": "Physics",
"type": "Boolean"
,
"sortOrder": 2,
"pupilAttribute":
"id": 1,
"name": "Biology",
"type": "Int32"
]
,
"sortOrder": 2,
"pupilAttributeCollection":
"id": 1,
"name": "Behaviour",
"sortedPupilAttributes": [
"sortOrder": 1,
"pupilAttribute":
"id": 3,
"name": "Attitude",
"type": "Int32"
,
"sortOrder": 2,
"pupilAttribute":
"id": 4,
"name": "Effort",
"type": "Boolean"
]
]
当从阿波罗查询返回相同的查询时,我得到以下数据(瞳孔属性集合和瞳孔属性都有相同的数据);
"data":
"pupilReports":
"new":
"date": "0001-01-01",
"pupilReportTemplateId": 0,
"pupilReportTemplate":
"id": 99,
"name": "KS3 Science",
"sortedPupilAttributeCollections": [
"sortOrder": 1,
"pupilAttributeCollection":
"id": 1,
"name": "Attainment",
"sortedPupilAttributes": [
"sortOrder": 1,
"pupilAttribute":
"id": 1,
"name": "Physics",
"type": "Boolean"
,
"sortOrder": 2,
"pupilAttribute":
"id": 1,
"name": "Physics",
"type": "Boolean"
]
,
"sortOrder": 2,
"pupilAttributeCollection":
"id": 1,
"name": "Attainment",
"sortedPupilAttributes": [
"sortOrder": 1,
"pupilAttribute":
"id": 1,
"name": "Physics",
"type": "Boolean"
,
"sortOrder": 1,
"pupilAttribute":
"id": 1,
"name": "Physics",
"type": "Boolean"
]
]
我正在根据检查从 apollo 查询返回的学生报告对象来解释第二组数据。
谁能解释为什么会这样?来自集合本身的数据在服务器中是硬编码的,因此第二组数据不可能是正确的。我只能假设它与缓存有关。
【问题讨论】:
【参考方案1】:重复数据的原因是阿波罗缓存系统正确地完成了它的工作。
Apollo 通过其 __typename 和 id(或 _id)字段来识别对象。由于我的硬编码测试数据中的错误,存在具有重复 ID 的对象。更正我的数据,使所有相同类型的对象都具有唯一的 ID(它们应该如此)解决了这个问题。
如果 id 字段不可用或 ID 预计会重复,则可以向 InMemoryCache 构造函数提供自定义 dataIdFromObject 函数,以告诉 Apollo 如何正确规范化此类对象。
请参阅here 以获得更好的解释
【讨论】:
以上是关于apollo graphql查询服务重复收集项目?的主要内容,如果未能解决你的问题,请参考以下文章
从 ruby gem 导出的 GraphQL 查询无法在 Xcode 项目上使用 Apollo 进行编译
为联合服务 apollo GraphQL 中的架构更改自动重新加载网关
我如何为 Apollo Client 指定 GraphQL 查询并获取属性出现适当字符串的项目