为什么 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

相反,查询直接进入服务器(成功),忽略了表单(具有 __typenameiddescription 字段)已经存在的事实缓存。即使它不在缓存中,我也希望表单的 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 到另一个服务,反之亦然。

无论如何,清理后一切正常。