当数据在缓存中时 Apollo 客户端 client.readQuery 返回 null

Cru*_*ink 13 apollo reactjs react-apollo apollo-client

这肯定是用户错误,但我有一个带有简单currentUser查询的应用程序,该查询在 JWT 中查找 id,查找它并返回相应的用户。

我可以查看 devtools 并看到它在缓存中__ref:User:19

export const CURRENT_USER_QUERY = gql`
  query{
    currentUser {
      id
      fullName
      email
    }
  }
`
Run Code Online (Sandbox Code Playgroud)

但在我的组件中,当我const { currentUser } = client.readQuery({ query: CURRENT_USER_QUERY });这样做时(间歇性地)会爆炸,因为:

Cannot destructure property 'currentUser' of 'client.readQuery(...)' as it is null.
Run Code Online (Sandbox Code Playgroud)

用户:19 存在并且是我需要的所有内容。我点击重新加载,同一页面就可以工作了。

我在客户端中将默认错误策略设置为“全部”。

这是客户端的版本3.3.11。Chrome v88.04,物有所值。反应 17.01。

我在这里错过了什么吗?如果该项目在缓存中,是否应该不同步(并且可靠地)返回值?

有没有更好的方法来处理这种情况?我正在尝试让这个应用程序不再将内容存储在 redux 或某些上下文提供程序中,因为它已经由 Apollo 处理。让一堆不同的东西来处理这个责任似乎是多余的。

Ant*_*eña 6

.readQuery()我昨晚遇到了问题。尽管逻辑是正确的,但我每次都返回 null。.readQuery()我在导入到 React 页面的组件中进行调用。

最终我的问题是,我没有更新我在“父”反应页面中所做的与组件中的查询相同的查询。

我不知道这是否是你遇到的同样的问题,但我想我会把它留在这里,以供永久和展望。

  • 事实上,您需要使用相同的查询,否则缓存将找不到它。显然,这也是我的问题,谢谢! (2认同)

Ali*_*lia 5

我面临着同样的问题。我是这样修复的:

const existingData = cache.readQuery({
   query: GET_CONTRACT,
   variables: {
       ...variables, // fixed: passing the same reference to variables
   },
});
Run Code Online (Sandbox Code Playgroud)