【发布时间】: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 客户端有所需的变量但它们不存在时,如何防止它尝试获取查询?
【问题讨论】:
标签: graphql single-page-application apollo-client