问题标签 [apollo-cache-inmemory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
61 浏览

http-headers - 如何从 apollo 客户端 3 的响应或缓存中提取数据

我正在尝试从 loginUser 突变中提取 jwt 并将其存储在变量中,然后使用 apollo-link 通过“Authorization: Bearer ${token} 进行身份验证,因为我的所有其他突变和查询都需要令牌. 我几天来一直在抨击 Apollo Client(React) -v 3.3.20 上的文档。我浏览了所有文档,他们展示了所有这些 client.readQuery 和 writeQuery 的例子,坦率地说,它们似乎只是重新获取数据?我不'不了解您实际上是如何从响应中提取数据并将其存储在变量中的。

响应存储在缓存中,我不知道如何获取该数据并将其存储在令牌变量中,如上所述。哪些远程查询我可以通过 useQuery 挂钩中的数据对象访问返回的数据,但是在 useMutation 挂钩上,数据返回未定义。关于堆栈溢出,我唯一能找到的是我的数据类型可能是自定义或非传统类型,但不确定这是否是问题所在。

[在 apollo 开发工具中缓存][1]

[apollo 开发工具中的突变][2]

[网络选项卡中的响应][3]

这是我的 ApolloClient 配置:

标头显然有效,我只是无法获取要传递的令牌,因此标头仅发送 Authorization: Bearer。

对于登录,我有这个:

本来我只是打电话

onClick={loginUser( { variables })}

对于登录,但 onComplete 永远无法正常工作,而且我到处都看到很多关于它的帖子,但没有解决方案。因此,我尝试将所有内容都放入一个函数中,然后在其中使用 loginUser 调用该函数:

在这一点上,我只是花了几个小时只是在尝试无意识的东西,以潜在地获得一些关于去哪里的线索。

但说真的,useMutation 中的 { data } 甚至在未定义的情况下会做什么。对我来说,从 useQuery 调用 data.foo 非常好,但 useMutation 它是未定义的。

任何帮助是极大的赞赏。[1]: https://i.stack.imgur.com/bGcYj.png [2]: https://i.stack.imgur.com/DlzJ1.png [3]: https://i.stack. imgur.com/D0hb3.png

0 投票
0 回答
21 浏览

caching - Apollo 客户端 writeQuery。显示 'Type { name: string }[] | undefined' 不是数组类型

尝试将新创建的对象添加到现有数组中时出现此错误。

在此处输入图像描述

0 投票
0 回答
63 浏览

apollo - Apollo 分页和缓存和网络获取策略

apollo 文档提出了一种在实现分页逻辑时在字段策略中实现合并功能的方法。

但是,当我对查询使用“缓存和网络”获取策略时,这意味着它首先从缓存中加载数据,然后将其发送到网络,并将现有列表与传入的数据一起附加,所以每个如果传入的数据与之前缓存中的数据相同,item 将在缓存中存在两次。

解决这个问题的正确方法是什么?我可以在合并函数中区分初始加载和 fetchmore 请求吗?对于应该覆盖我们从缓存中加载的内容的初始提取,合并功能显然应该以不同的方式工作,而对于分页提取更多。

0 投票
0 回答
68 浏览

react-native - 网络离线时使用graphql,apollo3-cache-persist反应本机的网络请求错误

接受的行为:

  1. 应用程序即使在离线时也应该工作。
  2. 从存储中读取数据。

当前行为:

  1. 当我第一次打开应用程序并关闭它并关闭网络而不使用它时,离线应用程序会在某个时候工作。
  2. 当我使用应用程序过多并离线并重新启动我的应用程序时。我收到“网络请求失败”的错误。
  3. 在控制台我得到“[apollo-cache-persist] 恢复大小为 89383 个字符的缓存”。
  4. 但在 UI 上,我收到网络请求错误。 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

0 投票
0 回答
40 浏览

graphql - 为什么 Apollo 客户端缓存在我运行 cache.diff 时说缺少字段

创建新记录后,我正在尝试更新我的 Apollo 缓存。

但是当我从缓存中读取(以获取当前集合值)时,它返回 null。我已经调查过cache.diff,它抱怨缺少字段错误。

当我检查缓存(通过 JS)时,它看起来确实存在该字段,那么可能出了什么问题?

这就是我正在做的事情:

我试图像这样从缓存中读取,但它返回null

我的query样子是这样的(用 包裹qgl):

当我运行时,cache.diff我得到以下结果:

cache.diff 结果

要检查我一直在运行的缓存apolloClient.cache.data.data,我可以看到该记录的记录Company:1和该记录上的字段userCollection

在此处输入图像描述

这里的任何帮助或见解将不胜感激。谢谢

0 投票
0 回答
93 浏览

graphql - 如何创建 Apollo 客户端读取函数以从嵌套对象中读取字段

我需要区分具有相同 __typename (Union) 的两个查询,以使 Apollo Client typePolicies 缓存正常工作。

联盟也是如此RelatedNodes,我没有从服务器获得唯一标识符字段。

nodes由一个称为 的字段来区分type。查看查询:

我想使用该字段nodes.type创建一个唯一标识符,我可以在keyFields属性中使用它(如keyFields: ['type'])。

Apollo 客户端typePolicies配置如下:

我正在尝试什么:

在我的查询中添加一个仅限本地的字段:

然后使用 Apollo Client读取功能,我想创建一个type字段来获取它的值nodes.type

那可能吗?

0 投票
1 回答
84 浏览

reactjs - Apollo Graphql relayStylePagination 防止查询重新获取变量更改

当我relayStylePagination在 Apollo 客户端缓存类型策略中使用辅助函数时,即使我refetch手动调用该函数,更改传递给查询的变量也不会再次调用该查询。它完美地完成了fetchMore行为并合并了新数据。

我的缓存字段如下所示:

0 投票
0 回答
47 浏览

reactjs - 订阅更多。当我使用 client.cache.modify 时,updateQuery 无法正常工作

我调用 subscribeToMore 函数,然后在 updateQuery 中得到新订单,我还需要更改状态缓存,即具有特定状态的订单数量,为此我使用 client.cache.modify。但是,如果我在没有 setTimeout 的情况下使用 client.cache.modify(或延迟 <500ms)。然后新订单不会与订单一起进入表格。如果我删除 client.cache.modify 一切正常

此代码适用于 setTimeout。但是如果没有 setTimeout 或 delay === 0 则不起作用。当我不使用 setTimeout 时,client.cache.modify 工作正常,但订单不会更新。我需要 client.cache.modify 工作并更新订单。如何才能做到这一点?如何删除 setTimeout 使其工作?

0 投票
1 回答
63 浏览

graphql - 具有 id 属性的 Graphql 类型,对于相同的 id 可以有不同的值

我想知道具有 id 属性的对象类型是否必须在给定相同 id 的情况下具有相同的内容。目前同一个id可以有不同的内容。

以下查询:

如果PriceSelectorInput是,{currency: "USD", country: "US"}那么结果是:

如果PriceSelectorInput是,{currency: "EUR", country: "DE"}那么结果是:

我的问题是,ProductSearchVariant 类型的 masterVariant 在这两种情况下的 id 都是 1,但 scopedPrice 的值不同。这会破坏 apollo 缓存 defaultDataIdFromObject 函数,如本 repo中所示。我的问题是;这是 apollo 中的错误还是违反了 ProductSearchVariant 类型定义中的 graphql 标准?

0 投票
0 回答
9 浏览

apollo-client - Apollo 缓存获取更多 & 变异

我正在尝试创建一个加载更多的页面,并使用一个对列表的特定项目执行突变的按钮,这是查询:

这是 fetchMore:

这是我的阿波罗配置:

fetchMore 工作正常,但是当我尝试运行突变时,我可以在屏幕上看到更改,但searchItems查询已被重新获取,并且屏幕上的列表在 fetchMore 之前更新为初始状态。

例子:

  • 打开页面,出现 1 个项目
  • 点击获取更多
  • 出现一个新项目
  • 针对第一项或第二项运行突变
  • 列表现在只包含第一项

我可以在网络选项卡上看到突变后的初始查询,它使用初始偏移量/限制执行