问题标签 [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 回答
46 浏览

javascript - 如何在 NextJs 中的页面转换之间使用相同的 Apollo 缓存?

我有来自 NextJS 官方示例 repo 的以下 apolloClient.js 文件:

我有两个页面:page1.js 使用 Apollo 钩子 (useQuery()) 和第二个页面 page2.js,它什么都不做,只返回 null。问题是,如果我使用 Chrome 扩展程序检查 Apollo 缓存,则 page1 上的查询的缓存结果不会出现在 page2 上。

如何仅使用 1 个全局缓存并防止在页面转换之间重新初始化缓存?

0 投票
0 回答
229 浏览

jestjs - Apollo 缓存忽略字段别名作为键(MockedProvider)

我看到 ApolloProvider 和 MockedProvider 之间的行为存在一些差异,并且在测试中引发了错误。

假设我有以下查询:

在 ApolloProvider 中,此查询使用字段别名作为键在 Apollo 缓存中创建条目,缓存中的每个条目Author都有一个id. 因此,Apollo 可以自动合并实体。

使用 MockedProvider 时,情况并非如此。当我模拟以下响应时:

我收到以下错误:

因此,ApolloProvider 中完全相同的查询使用id(字段别名)作为键,而在 MockedProvider 中它只是添加authorID为另一个字段条目。它忽略字段别名并且没有键。

显然,现在没有任何东西能够合并。我的第一个猜测是,这是因为 MockedProvider 无权访问架构,所以它不知道 authorID 是 ID 类型?还是我走远了?

对我来说真的很奇怪的一件事是 mymockResponse甚至没有提供authorID. 我的 mockResponse 是 { id: "test!!" } 但缓存显示了一个条目{"authorID":"test!!"},因此它本身以某种方式“无别名”。

我真的很难理解这里发生了什么。任何洞察力都将非常有用。

0 投票
0 回答
261 浏览

reactjs - 使用 apollo graphql hook useQuery 时超出最大调用堆栈大小

我正在使用 useQuery 挂钩来调用 grahql 查询,但收到此错误 - /

我正在使用获取策略 cahce-first 从 cahce 加载数据(如果可用)。

如果我刷新页面它工作正常。我认为这与缓存有关。但我已经在使用最新版本的 apollo-cache-inmemory。

0 投票
0 回答
48 浏览

caching - 利用 Apollo 缓存

在升级到 Apollo 客户端 3.3 时,我们决定启用缓存以减少网络流量并节省计算能力。我们试图实现这样的东西:

但是,在 Apollo 中实现的缓存不适合我们的数据结构,因此我们收到不正确的结果。

首先,我们使用过滤器 a 查询报告。我们在缓存中没有该查询的任何数据,因此我们点击后端并接收

在缓存中 apollo 自动存储:

然后我们使用过滤器 b 查询报告。我们再次在缓存中没有该查询的数据,然后点击后端并接收

在缓存中我们更新

当我们再次查询过滤器 a 的报告时,将访问缓存,因为已经存在一个查询:

然后解决对 VegaSpecification 的引用 - 返回

因此,我们为过滤器 a 返回了不正确的数据。我们使用“useMemo”来重新计算记忆值。

我们如何构造我们的实体,以便对于具有不同查询变量的不同查询,我们收到可以通过 id 区分的结果

0 投票
0 回答
54 浏览

apollo - Apollo 轮询查询覆盖缓存

我在使用 InMemoryCache 时遇到了一些问题,我一直想知道 apollo 究竟如何处理分配了 pollInterval 的查询。比如说,一个查询有一个 pollInterval 并且有默认的缓存策略。查询服务器,已获取新旧数据的混合作为响应,因此应修改缓存以包含新数据,没有类型策略。当在数据库中找到新数据时,我的轮询 useQuery 正在覆盖缓存字段(数据仍在缓存中,只是不再分配给该字段)所以我一直试图弄清楚 apollo 究竟是如何做这些事情的场景,我无法弄清楚查询与缓存的交互方式。

tldr 当轮询的 useQuery 获取新数据时,缓存字段会发生什么情况?

0 投票
1 回答
294 浏览

react-native - Apollo 缓存查询字段策略 offsetLimitPagination() 不适用于订阅

我使用 apollo 客户端进行原生反应。

当我使用 offsetLimitPagination() 进行分页时,我的订阅不会更新缓存。

订阅可以正常工作,但不会更新平面列表数据。当我删除 offsetLimitPagination 函数时,它可以工作。我不能在缓存上同时使用订阅和 offsetLimitPagination 函数。

有什么解决办法吗?

谢谢。

缓存

聊天详情页

0 投票
1 回答
128 浏览

react-native - 为聊天应用程序缓存 apollo 客户端的最佳方式是什么?

当我将 apollo 客户端缓存用于聊天应用程序时,出现逻辑错误。

例如,我去第一个房间缓存显示 10 条消息,当我这次单击另一个房间时,我会收到有关上次访问房间的消息? 我的缓存

这是房间

在此处输入图像描述

这是第一个房间,只有 2 条信息

在此处输入图像描述

这是K3房间,有16条消息

在此处输入图像描述

0 投票
0 回答
166 浏览

reactjs - WriteQuery 未将对象写入 apollo 缓存

我正在尝试将 Apollo Cache 专门用于本地状态管理。我正在使用 Apollo Client 3。我正在尝试使用缓存中的 writeQuery 写入默认状态(一个简单对象),但它没有写入缓存中。我在这里找不到我缺少的东西。

我检查了我们不需要 typeDefs 来读取和写入缓存,只要我们不想在 apollo 开发工具中进行自省。因此我初始化了一个简单的客户端

并使用它提供给我的组件ApolloProvider

尽管运行了执行 client.writeQuery 的代码,但我在 Apollo 缓存中看不到任何内容,并且预期,运行 useQuery 的组件之一也返回未定义的数据。我错过了什么?

0 投票
0 回答
37 浏览

react-native - ApolloClient 缓存不会存储每个项目

我对 ApolloClient 缓存有疑问。有一些项目未存储在缓存中。

环境:反应原生

套餐:

  • @apollo/客户
  • @react-native-async-storage/async-storage
  • apollo3-cache-persist

结果(没有缓存):

结果(使用缓存:策略:缓存优先)

我不认为这是规范化的问题,因为元素具有idand __typename。我也尝试使用keyFields: falsefor禁用规范化,Stage但这不起作用。

如果我没有提供足够的信息,请告诉我。谢谢您的帮助!

0 投票
0 回答
134 浏览

apollo-client - 覆盖 Apollo 内存缓存中的 id

在基于 Apollo 的 Web 应用程序中,用户可以使用服务器 api 更改实体的标识符(即 graphql defs 中的“id”标识符)。
在该操作的那一刻,当前的 Apollo in-memory-cache 已经包含许多关于在许多上下文中更新 id-entity 的引用:

  • 主缓存实体引用(位于 的根目录cache.data.data
  • 不同其他实体中的各种引用(通过__ref字段)

所有这些引用都会停止,以及任何涉及更新实体 ID 的查询监视

查询监视问题可以应用程序解决。

关于缓存,我没有找到这个用例的任何内置功能,
所以我想知道我是否可以手动管理它。

我会手动修改cache.data.data对象:

  • 克隆顶级实体,将顶级道具名称相应地重命名为新 id
  • 删除原来的
  • 扫描整个缓存 obj__ref并相应地更改值

这种方法有什么问题吗?
我错过了什么吗?
未来的 lib 升级有多大可能改变刹车?
有更清洁的方法吗?