Apollo 查询有来自缓存的错误数据

Apollo query has the wrong data from cache

Apollo 查询在我的 React 应用程序中的缓存中有错误的数据。

如果我将查询的 fetchPolicy 设置为 'network-only',一切正常。

所以我认为是缓存问题

一直在努力解决问题,看了apollo缓存的文章,还是无法解决问题

这是我查询后的结果:

参数memberId为空(结果正确)

[
  {
    "id": 87,
    "totalQuantity": 12,
    "Orders": [
      {
        "id": 1,
        "quantity": 11,
        "Member": {
          "id": 1,
          "name": "A"
        }
      },
      {
        "id": 28,
        "quantity": 1,
        "Member": {
          "id": 9,
          "name": "B"
        }
      }
    ]
  },
  {
    "id": 88,
    "totalQuantity": 1,
    "Orders": [
      {
        "id": 2,
        "quantity": 1,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  }
]

参数memberId为9(结果正确)

[
  {
    "id": 87,
    "totalQuantity": 1,
    "Orders": [
      {
        "id": 28,
        "quantity": 1,
        "Member": {
          "id": 9,
          "name": "B"
        }
      }
    ]
  }
]

参数memberId为1(结果正确)

[
  {
    "id": 87,
    "totalQuantity": 11,
    "Orders": [
      {
        "id": 1,
        "quantity": 11,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  },
  {
    "id": 88,
    "totalQuantity": 1,
    "Orders": [
      {
        "id": 2,
        "quantity": 1,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  }
]

但是当我返回参数为空时结果是错误的

[
  {
    "id": 87,
    "totalQuantity": 11,
    "Orders": [
      {
        "id": 1,
        "quantity": 11,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  },
  {
    "id": 88,
    "totalQuantity": 1,
    "Orders": [
      {
        "id": 2,
        "quantity": 1,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  }
]

会员 B (id = 9) 消失了..

而我返回的参数是9(结果是错误的)

[
  {
    "id": 87,
    "totalQuantity": 11,
    "Orders": [
      {
        "id": 1,
        "quantity": 11,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  }
]

我得到的是会员A的数据,而不是会员B

有人可以帮助我吗?谢谢


我的客户端配置(缓存是InMemoryCache)

const client = new ApolloClient({
  link: ApolloLink.from([
    httpLink,
  ]),
  cache,
  dataIdFromObject: o => ${o.id}${o.__typename},
});

我使用 queryHook 来包装我的组件

const queryHook = graphql(FETCH_ORDER_GROUP_SHIPMENT_LIST, {
  options: ownProps => ({
  variables: {
    memberId: ownProps.options.memberId || null,
  },
}),
  props: ({
    data: {
      orderGroupShipmentList,
    },
  }) => ({
    orderGroupShipmentList: orderGroupShipmentList || [],
  });

我还使用查询标签(其他数据)来包装我的内容

参数也是memberId

这样的结构

<Query
  variables={{ memberId: options.memberId || null }}
  query={FETCH_MEMBER_LIST_QUERY}>
  content that use orderGroupShipmentList and memberList
</Query>

不知道够不够具体

如果不够具体请告诉我

谢谢


2019-09-16

遇到同样问题的朋友:

https://kamranicus.com/posts/2018-03-06-graphql-apollo-object-caching

@Anymore - 我们能看到你的 FETCH_MEMBER_LIST_QUERY 代码吗?您是否正在获取所有数据的 ID?如果没有 ID,它将无法匹配关系。

您是否尝试过使用 Apollo Client DevTools - 它们可以让您轻松查看缓存的内容。可以在 GitHub here and the Chrome Webstore here

上找到

使用它您将能够查看项目是否被正确缓存。

您需要在查询的返回结果中为该类型设置不同的 ID。例如,根据 memberId,您对 id 87 有不同的结果,因此缓存将被您的第二个查询覆盖,并且由于 apollo 不会重新获取默认情况下已经进行的查询,它将继续查看覆盖的结果。