代码之家  ›  专栏  ›  技术社区  ›  John

为什么阿波罗不为此查询调用我的cacheredirect?

  •  0
  • John  · 技术社区  · 6 年前

    使用阿波罗角,我有一个这样的阿波罗记忆。

    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' . 我还没有弄清楚为什么它应该是未定义的,或者为什么它对于我的非常相似的工作查询是未定义的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   John    6 年前

    ApolloModule Apollo

    推荐文章