Почему 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 (и кеш) не был одноэлементным сервисом, он был продублирован! Кэш запросов одного сервиса не был разделен / доступен для другого сервиса и наоборот.
Во всяком случае, после очистки все работает как положено.