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

时间:2019-02-10 03:56:11

标签: node.js reactjs apollo react-apollo apollo-client

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

如果我将查询的fetchPolicy设置为“仅限网络”,则一切正常。

所以我认为这是一个缓存问题。

我一直在努力解决该问题,并查看有关阿波罗缓存的文章,但仍然无法解决问题。

以下是我查询后的结果:

参数memberId为null(结果正确)

[
  {
    "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"
        }
      }
    ]
  }
]

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

[
  {
    "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 || [],
  });

我也使用Query标签(其他数据)包装内容

,它的参数也是memberId。

像这样的结构

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

我不知道这是否足够具体

让我知道这是否不够具体

谢谢

2 个答案:

答案 0 :(得分:0)

@Anymore-我们可以看到您的FETCH_MEMBER_LIST_QUERY代码吗?您是否正在获取所有数据的ID?没有ID,就无法匹配关系。

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

上找到

使用此方法,您将能够查看该项目是否被正确缓存。

答案 1 :(得分:0)

您需要为查询的返回结果提供不同的ID。例如,对于基于id的id 87,您具有不同的结果,因此第二个查询将覆盖缓存,并且由于apollo不会重新获取默认情况下已经进行的查询,因此它将继续查看覆盖的结果。