Apollo查询不会返回使用readFragment可用的缓存数据

时间:2019-08-08 19:24:39

标签: graphql apollo react-apollo

我有2个查询:getGroups(): [Group]getGroup($id: ID!): Group。一个组件首先使用getGroups()加载所有组,然后在另一个组件上需要通过ID访问特定的Group数据。

我希望Apollo的规范化已经在缓存中具有组数据,并且在执行getGroup($id: ID!)查询时会使用它,但这不是事实。

当我设置cache-only fetchPolicy时,不返回任何内容。我可以使用readFragment访问数据,但是它不像使用查询那样灵活。

是否有一种简单的方法可以使Apollo像我期望的那样从其他查询返回缓存的数据?

1 个答案:

答案 0 :(得分:1)

通常有一个查询字段返回一个节点列表,而另一个查询字段接受一个id参数并返回一个节点。但是,决定某个字段返回哪些特定节点或哪些节点最终是服务器域逻辑的一部分。

作为一个愚蠢的例子,想象一下如果您有一个类似getFavoriteGroup(id: ID!)的字段-您可能在缓存中有具有该ID的组,但这并不一定意味着它应该由该字段返回(它可能不被收藏)。有许多因素(其他参数执行上下文等)可能会影响字段返回的节点。作为客户,在Apollo上不应该对您的域逻辑进行假设。

但是,您可以通过实现query redirects来有效地复制该逻辑。

const cache = new InMemoryCache({
  cacheRedirects: {
    Query: {
      group: (_, args) => toIdValue(cache.config.dataIdFromObject({ __typename: 'Group', id: args.id })),
    },
  },
});