我'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',
},