我正在尝试在Razzle上使用GraphQL / Apollo构建SSR React应用程序。我遵循了using Apollo with SSR的指导,但是有些事情我还无法完全解决,我想知道我是否在这里遗漏了一些东西。
说,在我的应用程序中,该应用程序的每个新用户都有一个basket_id
来引用他们的购物车。访问该应用程序后,将检索其购物车的当前状态(其中包含所有物品):
basket(basketId: "abc123") {
...BasketFragment
}
这是在服务器上发生的,因为页面首先被呈现,然后才发送给客户端。
他们可以使用类似以下的变体将商品添加到购物车:
addProductToBasket(
basketId: "abc123"
productId: 42
) {
...BasketFragment
}
响应是带有新添加项目的更新购物篮。此功能非常适合客户端使用,并且使用购物篮更新了缓存,购物篮页面显示了所有项目。
但是,尽管发生了所有这些事情,最初呈现页面的服务器对此一无所知。如果用户刷新页面,则反应服务器将执行basket
查询,并查看其Apollo缓存中已经有响应。它不会打扰查询GraphQL服务器,而只是在添加项目之前用开始时具有的购物篮呈现页面。这样会导致页面显示为旧版本的购物篮。
如何防止服务器缓存过时?
理想情况下,我永远不会在服务器上缓存,但似乎无法正常工作。我已经在服务器的Apollo客户端实例上尝试了以下defaultSettings
:
watchQuery: {
fetchPolicy: 'network-only',
errorPolicy: 'ignore',
},
query: {
fetchPolicy: 'network-only',
errorPolicy: 'all',
},