我'm experimenting with building a SSR React application with GraphQL/Apollo on top of Razzle. I'遵循了using Apollo with SSR的指导,但是's something I can' t完全开始工作了,我在这里错过了一些东西 .
比如说,在我的应用程序中,每个新用户都有一个 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',
},