【问题标题】:Apollo query within NextJS's getServerSideProps?使用 Next Js getServerSideProps 进行 Apollo 查询?
【发布时间】:2020-09-29 23:01:14
【问题描述】:

我正在将 NextJS 与 Apollo 一起使用。文档不多说,但指向这个 repo:https://github.com/vercel/next.js/tree/canary/examples/with-apollo

使用此代码:

export async function getStaticProps() {
  const apolloClient = initializeApollo()

  await apolloClient.query({
    query: ALL_POSTS_QUERY,
    variables: allPostsQueryVars,
  })

  return {
    props: {
      initialApolloState: apolloClient.cache.extract(),
    },
    unstable_revalidate: 1,
  }
}

我觉得这很丑,所以我尝试使用钩子:

const res = useQuery(ALL_POSTS_QUERY);

但我得到一个错误:

错误:无效的挂钩调用。 Hooks 只能在函数组件的主体内部调用。这可能是由于以下原因之一:

那么你不能在getStaticPropsgetServerSideProps 中使用钩子吗?如果是这样,是否有更好的语法来进行 GraphQL 查询?

【问题讨论】:

标签: next.js apollo


【解决方案1】:

您可以使用 GraphQL 代码生成器来改进它。

例如,我正在做类似的事情,我的代码如下所示:

const response = await apolloClient.query<ViewerQuery>({
  query: ViewerDocument,
});

其中ViewerQueryViewerDocument 由GraphQL 代码生成器生成。

【讨论】:

  • 嗨!我在 getServerSideProps 中使用相同的代码,你能给我一些建议吗?是否可以在每个页面上初始化 apollo 以发送请求?我的目标是检查现有的动态路线
  • 我不确定创建一个新的 apollo 客户端有多轻量级。我认为这还不错,与获取数据、执行 SSR 等相比,创建新对象应该可以忽略不计。如果您担心,可以测量它。需要注意的一点是,你在服务端和客户端(浏览器)上的 apollo 客户端会有不同的缓存,这可能会导致数据变异后出现一些不一致的结果。
  • 感谢@arcticmatt 的回答!你能帮我解决我的问题吗?如果需要,我可以创建另一个 stackoverflow 问题。我试图为我的动态路由强制使用 404 状态代码,但是每个页面上的 apollo 客户端初始化需要一些延迟,并且我失去了主要的 apollo 技巧 - 缓存。目前我正在检查 getServerSideProps 中的现有路由。如果我在 apollo 钩子中检查它,它会返回 202 而不是 404 状态码。非常感谢!
  • stackoverflow.com/questions/63877962/…这个问题和我的问题类似
猜你喜欢
  • 1970-01-01
  • 2021-05-04
  • 2018-07-23
  • 2019-12-06
  • 2017-09-08
  • 2021-01-16
  • 2019-10-09
  • 2019-10-03
  • 1970-01-01
相关资源
最近更新 更多