为什么 apollo 不为此查询调用我的 cacheRedirect?
Why isn't apollo calling my cacheRedirect for this query?
使用 apollo-angular,我有一个像这样的 apollo InMemoryCache
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
的cacheRedirect函数没有被调用。
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
关于 cacheRedirects 的工作原理,我是否遗漏了一些明显的信息?我的印象是,只要调用以 query Form {}
开头的查询,form
的 cacheRedirect 应该 运行.
非常感谢任何帮助!我想我遗漏了一些明显的东西......
注意:我对cacheRedirect的理解是WholeFormResponse
片段的内容无关紧要,所以我没有包含它们。
更新
打开调试器并逐步执行一些代码,我的 cacheRedirect 函数没有被调用的原因(在错误的示例中)是因为 typeof fieldValue
in this line of the apollo InMemoryCache source code !== 'undefined'
。我还没有弄清楚为什么它应该是未定义的,或者为什么它对我的非常相似的工作查询来说等于未定义。
经过 7 个小时的调试,我搞定了!!!! :D
原来这是一个 Angular 问题,而不是 Apollo 问题。两个查询(成功的和有问题的)都在 运行 不同的 angular 服务中,这些服务本身是不同 NgModule 的每个部分。这两个父 NgModule 都导入并自定义了 apollo-angular ApolloModule
。这导致 Apollo
服务的两个独立实例。
换句话说,我的 apollo 客户端(和缓存)不是单例服务,它是重复的!一个服务的查询缓存不是 shared/available 到另一个服务,反之亦然。
无论如何,清理后一切正常。
使用 apollo-angular,我有一个像这样的 apollo InMemoryCache
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
的cacheRedirect函数没有被调用。
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
关于 cacheRedirects 的工作原理,我是否遗漏了一些明显的信息?我的印象是,只要调用以 query Form {}
开头的查询,form
的 cacheRedirect 应该 运行.
非常感谢任何帮助!我想我遗漏了一些明显的东西......
注意:我对cacheRedirect的理解是WholeFormResponse
片段的内容无关紧要,所以我没有包含它们。
更新
打开调试器并逐步执行一些代码,我的 cacheRedirect 函数没有被调用的原因(在错误的示例中)是因为 typeof fieldValue
in this line of the apollo InMemoryCache source code !== 'undefined'
。我还没有弄清楚为什么它应该是未定义的,或者为什么它对我的非常相似的工作查询来说等于未定义。
经过 7 个小时的调试,我搞定了!!!! :D
原来这是一个 Angular 问题,而不是 Apollo 问题。两个查询(成功的和有问题的)都在 运行 不同的 angular 服务中,这些服务本身是不同 NgModule 的每个部分。这两个父 NgModule 都导入并自定义了 apollo-angular ApolloModule
。这导致 Apollo
服务的两个独立实例。
换句话说,我的 apollo 客户端(和缓存)不是单例服务,它是重复的!一个服务的查询缓存不是 shared/available 到另一个服务,反之亦然。
无论如何,清理后一切正常。