Кэш-очистка серверного приложения 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',
},