当这些变量被删除时,如何停止获取所需导出变量的 Apollo GraphQL 查询
Posted
技术标签:
【中文标题】当这些变量被删除时,如何停止获取所需导出变量的 Apollo GraphQL 查询【英文标题】:How can I stop an Apollo GraphQL query with required exported variables from fetching when those variables are removed 【发布时间】:2021-02-04 01:23:09 【问题描述】:问题
当导航离开使用应用程序路由的状态作为必需变量的查询组件时,我得到了 GraphQL 的排序错误:
所需类型“ID!”的变量“$analysisId”没有提供。
“导航离开”意味着,例如,去
来自:/analysis/analysis-1/analyse/
至:/user-profile/
背景
我正在使用 Apollo GraphQL 构建一个 SPA,并且我有一些遵循这种模式的查询:
query Analyse($analysisId: ID!)
location @client
params
analysisId @export(as: "analysisId")
analysis(analysisId: $analysisId)
id
# ... etc
location
字段表示 SPA 路由器的状态。该状态保存在 Apollo 客户端“反应变量”中。查询组件被编程为不会开始订阅查询,除非该反应变量存在并且具有所需的内容。
shouldSubscribe(): boolean
return !!(locationVar()?.params?.analysisId);
Params 表示 express 样式的 URL 参数,所以路由路径为/analysis/:analysisId/analyse
。
如果用户导航到/analysis/analysis-1/analyse
,则查询组件的variables
变为: analysisId: "analysis-1" `。这在加载组件时工作正常。
我认为正在发生的事情
当组件连接到 DOM 时,它会检查路由器状态中是否存在所需的变量,如果存在,它会创建一个 ObservableQuery
并订阅。
后来,当用户离开时,ObservableQuery
仍然订阅更新,而客户端字段 location.params.analysisId
导出的所需 analysisId
变量突然无效。
我认为由于ObservableQuery
仍然被订阅,它发送带有空analysisId
变量的查询,即使它是必需的。
我的尝试
通过中断我的query component base class 中的每个方法,我有理由确定组件基类没有错误 - 没有证据表明它在路由更改时重新获取组件。相反,我认为这发生在 apollo 客户端内部。
我或许可以将查询的架构从 analysis(analysisId: ID!): Analysis
更改为 analysis(analysisId: ID): Analysis
,但这似乎是迂回的,因为我可能无法控制服务器。
当 apollo 客户端有所需的变量但它们不存在时,如何防止它尝试获取查询?
【问题讨论】:
【参考方案1】:到目前为止,这似乎工作正常,在我的 HttpLink 中,src/apollo/link/http.ts
:
import ApolloLink, from from '@apollo/client/link/core';
import HttpLink from '@apollo/client/link/http';
import hasAllVariables from '@apollo-elements/lib/has-all-variables';
const uri =
'GRAPHQL_HOST/graphql';
export const httpLink = from([
new ApolloLink((operation, forward) =>
if (!hasAllVariables(operation))
return;
else
return forward(operation);
),
new HttpLink( uri ),
]);
【讨论】:
以上是关于当这些变量被删除时,如何停止获取所需导出变量的 Apollo GraphQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
当变量被称为字符串时,如何获取变量值而不是变量名? [复制]
驱动中获取PsActiveProcessHead变量地址的五种方法也可以获取KdpDebuggerDataListHead