Apollo GraphQl renderToStringWithData 在服务器运行后总是相同的数据

Posted

技术标签:

【中文标题】Apollo GraphQl renderToStringWithData 在服务器运行后总是相同的数据【英文标题】:Apollo GraphQl renderToStringWithData always same data after server run 【发布时间】:2018-06-02 10:07:34 【问题描述】:

我刚刚使用 apollo Graphql 为 s-s-r 创建了一个 expressJs 服务器。 我有这个问题:页面启动后,页面的来源是预期的,但在服务器运行之前,Graphql 获取的数据永远不会改变。

这是我在页面源代码中的内容:

我目前正在使用http://fake.graphql.guru/graphql 获取一些模拟数据,并且数据会随机更改为每个请求。

按照expressjs的代码和apolloClient的配置

// express js
app.get('*', (req, res, next) => 
  renderToStringWithData(<StaticRouter location=req.url context=><App /></StaticRouter>).then((content) => 
  const initialState = client.extract();
  res.status(200);
  res.setHeader('Cache-Control', 'no-cache');
  res.send(Template(
    content,
    state: initialState,
  ));
  next();
  );
);

// apollo client
const client = new ApolloClient(
  s-s-rMode: true,
  link: new HttpLink(
    fetch,
    uri: 'http://fake.graphql.guru/graphql',
  ),
  cache: new InMemoryCache().restore(process.env.NODE_ENV !== 'PROD' ? 
    window.__APOLLO_STATE__ : null),
  defaultFetchPolicy: 'network-only',
  s-s-rForceFetchDelay: 100,
);

所以我对每个请求的期望是服务器返回一个带有新数据的新 html 页面。怎么了?

【问题讨论】:

这里是github代码如果有人想看看github.com/kenta88/graphqlMockApp/tree/server_side_rendering 【参考方案1】:

我找到了解决方案: 为了为每个请求重置客户端的缓存,只需调用 client.resetStore()

app.get('*', (req, res, next) => 
// reset the client cache
client.resetStore();
renderToStringWithData(<StaticRouter location=req.url context=>
<ReactApp /></StaticRouter>).then((content) =>  // eslint-disable-line
  const initialState = client.extract();
  res.status(200);
  res.setHeader('Cache-Control', 'no-cache');
  res.send(Template(
    content,
    state: initialState,
  ));
  next();
  );
);

【讨论】:

以上是关于Apollo GraphQl renderToStringWithData 在服务器运行后总是相同的数据的主要内容,如果未能解决你的问题,请参考以下文章

(Apollo) GraphQL 合并模式

具有多个 GraphQL 端点的 Apollo

GraphQL - 如何捕获“内部”Apollo/GraphQL 错误 - Java Spring Boot

GraphQL“必须提供查询字符串” graphql-tag react-apollo

GraphQL - “Federations”是普通 Graphql 的事情还是 Apollo 的事情?

Apollo/GraphQL:如何获取嵌套元素?