Кэш-очистка серверного приложения GraphQl с использованием Apollo

Я экспериментирую с созданием приложения SSR React с GraphQL/Apollo поверх Razzle. Я следовал инструкциям по использованию Apollo с SSR, но есть кое-что, что я не могу заставить работать, и мне интересно, что я что-то здесь упускаю.

Скажем, в моем приложении каждый новый пользователь имеет basket_id что относится к их корзине. При посещении приложения восстанавливается текущее состояние их корзины (с любыми элементами в ней):

basket(basketId: "abc123") {
  ...BasketFragment
}

Это происходит на сервере, так как страница сначала отображается перед отправкой клиенту.

Они могут добавлять товары в корзину, используя мутацию, такую ​​как:

addProductToBasket(
  basketId: "abc123"
  productId: 42
) {
  ...BasketFragment
}

Ответ - обновленная корзина с новым добавленным товаром. Это прекрасно работает на стороне клиента, и кеш обновляется корзиной, а на странице корзины отображаются все элементы.

Однако, хотя все это происходит, сервер, который изначально отображал страницу, не имеет об этом никакого представления. Если пользователь обновит страницу, сервер реакции выполнит basket запросите и увидите, что он уже имеет ответ в своем кэше Apollo. Он не будет беспокоить запрос к серверу GraphQL и просто отобразит страницу с корзиной, которая была у него в начале - до добавления элемента. В результате страница отображается с устаревшей версией корзины.

Как я могу предотвратить устаревание кэша сервера?

В идеале я бы просто никогда не кэшировал на сервере, но я не могу заставить это работать. Я пробовал следующее defaultSettings на клиентском экземпляре сервера Apollo:

watchQuery: {
  fetchPolicy: 'network-only',
  errorPolicy: 'ignore',
},
query: {
  fetchPolicy: 'network-only',
  errorPolicy: 'all',
},

0 ответов

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