Apollo 中 NextJs s-s-r 和 cookie 的问题

Posted

技术标签:

【中文标题】Apollo 中 NextJs s-s-r 和 cookie 的问题【英文标题】:Issues with NextJs s-s-r and cookies in Apollo 【发布时间】:2020-08-20 23:28:57 【问题描述】:

我想在我的 nextjs 应用程序中使用 cookie 进行身份验证。我的代码中有一个错误,s-s-r 无法工作,因为在代码执行过程中的某个地方,它在页面的第一次渲染中找不到 cookie,因此它会引发错误。我现在已经使用了很多代码,并且已经将其置于数据最终会加载但不会成为 s-s-r 页面的状态。有没有其他人处理过这个问题? 我正在使用下一个,apollo 客户端和 apollo server express。

【问题讨论】:

发布您的代码。 【参考方案1】:

当您执行 s-s-r 时,代码会在服务器上运行。您在浏览器中添加的 cookie 默认不可用。然后您可以通过req.headers.cookie 访问getInitialPropsgetServerSideProps 并再次将其传递给验证码。

或者,您可以使用支持同构 cookie 的 npm 模块,例如 react-cookie https://www.npmjs.com/package/react-cookie。链接上提供了更多关于集成的示例。

【讨论】:

【参考方案2】:

我们可以在发送前自定义标题。

请在此链接https://github.com/apollographql/apollo-client/issues/5089#issuecomment-749301669查看我的完整答案

async function getHeaders(ctx) 
  if (ctx?.req?.cookies) 
    const cookieItems = []
    for (let key of Object.keys(ctx?.req?.cookies)) 
      cookieItems.push(`$key=$ctx.req.cookies[key]`)
    
    return 
      cookie: cookieItems.join('; ')
    
  

  return 
  


WithApollo.getInitialProps = async (ctx) => 
      const  AppTree  = ctx
      // Initialize ApolloClient, add it to the ctx object so
      // we can use it in `PageComponent.getInitialProp`.
      const apolloClient = (ctx.apolloClient = initApolloClient(null, await getHeaders(ctx)))
      // Run wrapped getInitialProps methods
      let pageProps = 
      if (PageComponent.getInitialProps) 
        pageProps = await PageComponent.getInitialProps(ctx)
      

    ............



【讨论】:

以上是关于Apollo 中 NextJs s-s-r 和 cookie 的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何从 NextJS 服务器为 Apollo 客户端补充水分

Next Js 自定义路由和 s-s-r

在 NextJs s-s-r 中操作 DOM onClick

在 NextJS、nginx 和 Material-ui(s-s-r) 中使用 CSP

电容器中的 NextJS s-s-r

NextJS 使用 s-s-r 和 Styled-Components 构建错误