查询覆盖了Apollo缓存中的缺少字段

时间:2018-09-18 07:29:03

标签: graphql apollo react-apollo

我遇到一种情况,有时我想查询包含几个字段的许多对象的列表,有时只查询一个包含很多字段的对象。例如,请考虑以下两个查询:

  • 具有许多对象和少量字段的查询:

    query {
      object(many=true) {
        id
        name
      }
    }
    
  • 具有单个对象和多个字段的查询:

    query {
      object(many=false) {
        id
        ... (many other fields)
      }
    }
    

我不想在第一个查询中请求多余的字段,因为这将导致请求包含大量数据(否则,我可以使字段相同,例如使用fragment,我的问题)。

问题是:根据__typenameid对存储在缓存中的数据进行规范化和存储。这意味着如果查询相同,则查询或查询的原子将相互覆盖。因此,如果第二个查询最后一次发生,则数据库中的项目没有与第一个查询关联的组件所必需的name字段。

最简单的解决方案就是在第二个查询中也要求name。问题在于,这似乎很脆弱且容易出错。例如,一个人可能创建第三个查询,却忘记在那里询问name

另一种选择是使它们具有不同的__typename,即在后端区分它们。但这似乎是人为的。这些查询实际上是在处理相同类型的对象。

是否有规范的方法可以解决此问题?

1 个答案:

答案 0 :(得分:0)

对于最终到达这里的任何人:事实证明,至少在当前版本 (@apollo/client 3.3.6) 中,数据已合并,因此这不是问题。