Почему apollo не вызывает мой cacheRedirect для этого запроса?

Используя 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 });
      },
    },
  },
});

Когда я запускаю этот запрос, функция cacheRedirect для 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

Я что-то упускаю из виду, как работает cacheRedirects? У меня сложилось впечатление, что в любое время запрос, начинающийся сquery Form {}называется cacheRedirect дляformдолжен бежать.

Любая помощь очень ценится! Я предполагаю, что упускаю что-то очевидное...

Примечание: мое понимание cacheRedirect заключается в том, что содержимоеWholeFormResponseфрагменты не имеют значения, поэтому я их не включил.

Обновить

Открытие отладчика и пошаговое выполнение некоторого кода, причина, по которой моя функция cacheRedirect не вызывается (в ошибочном примере), заключается в том, что typeof fieldValue в этой строке исходного кода Apollo InMemoryCache !== 'undefined', Я еще не смог понять, почему он должен быть неопределенным или почему он равен неопределенному для моего очень похожего рабочего запроса.

1 ответ

Решение

После 7 часов отладки я выяснил это!!!!:D

Оказывается, это была угловая проблема, а не проблема Аполлона. оба запроса (успешный и проблемный) выполнялись внутри разных угловых сервисов, которые сами по себе были частью разных NgModules. Оба этих родительских модуля NgModules импортировали и настраивали аполло-угловой ApolloModule, Это привело к двум отдельным случаям Apollo сервис.

Иными словами, мой клиент apollo (и кеш) не был одноэлементным сервисом, он был продублирован! Кэш запросов одного сервиса не был разделен / доступен для другого сервиса и наоборот.

Во всяком случае, после очистки все работает как положено.

Другие вопросы по тегам