使用阿波罗角,我有一个这样的阿波罗记忆。
new InMemoryCache({
// ... stuff
cacheRedirects: {
Query: {
form: (_, args, { getCacheKey }) => {
console.log('cache key', [args, getCacheKey({ __typename: 'Form', id: args.formId })]);
return getCacheKey({ __typename: 'Form', id: args.formId });
},
},
},
});
当我运行此查询时,
form
未调用。
this.apollo.watchQuery({
query: gql`
query FormSummary($formId: ID!) {
form(formId: $formId) {
__typename
id
description
}
}
`,
variables: { formId }
}).valueChanges
相反,查询只是直接进入服务器(成功),忽略了表单
__typename
,
id
和
description
字段)已在缓存中。即使它不在缓存中,我也希望仍然调用表单的cacheredirect函数。当我做这个的时候
极其相似的查询
,窗体的cacheRedirect
被调用
.
this.apollo.watchQuery<any>({
query: gql`
query FormGet($formId: ID!) {
form(formId: $formId) {
...WholeFormResponse
}
}
${Fragments.wholeFormResponse}
`,
variables: { formId: id },
}).valueChanges
对于缓存重定向的工作方式,我是否遗漏了一些明显的东西?我的印象是,任何时候只要一个问题以
query Form {}
调用的cacheRedirect
形式
应该运行。
非常感谢您的帮助!我想我错过了一些明显的…
注意:我对cacheRedirect的理解是
WholeFormResponse
片段是不相关的,所以我没有包含它们。
更新
打开调试器并单步执行一些代码,不调用cacheredirect函数(在错误的示例中)的原因是
typeof fieldValue
in this line of the apollo InMemoryCache source code
!== 'undefined'
. 我还没有弄清楚为什么它应该是未定义的,或者为什么它对于我的非常相似的工作查询是未定义的。