如何在 NextJS 应用程序中从 Apollo 链接上下文访问 Express HTTP 请求?

Posted

技术标签:

【中文标题】如何在 NextJS 应用程序中从 Apollo 链接上下文访问 Express HTTP 请求?【英文标题】:How to access Express HTTP Request from Apollo Link Context, in a NextJS App? 【发布时间】:2020-04-02 18:20:07 【问题描述】:

我正在构建一个NextJS 应用程序,我正在尝试访问cookie,因此我可以使用它为GraphQL Request 设置Http Header,我正在使用apollo-link-context。这是创建ApolloClient的代码

function createApolloClient(initialState = ) 
  const httpLink = new HttpLink( uri: `$baseUrl/graphql`, credentials: 'same-origin', fetch )

  const authLink = setContext((_, prevCtx) => 
    let token = ''
    if (typeof window === 'undefined') token = getCookieFromServer(authCookieName, REQ)
    else token = getCookieFromBrowser(authCookieName)
    return ( headers:  'Auth-Token': token  )
  )

  const client = new ApolloClient(
    s-s-rMode: typeof window === 'undefined',
    cache: new InMemoryCache().restore(initialState),
    link: authLink.concat(httpLink)
  )

  return client

这里的问题是 getCookieFromServer 函数需要 Express Request 作为第二个参数,因此它可以从 req.headers.cookie 中提取 cookie,我不知道从哪里可以得到它。

【问题讨论】:

【参考方案1】:

我终于找到了办法。每当我从服务器(在PageComponent.getInitialProps)发送请求时,我都会在上下文中设置标头,然后我可以从setContext 访问它:

PageComponent.getInitialProps = async (ctx) => 
  ...
  const token = getCookieFromServer(authCookieName, ctx.req)
  const  data  = await client.query(
    query,
    context:  headers:  'Auth-Token': token  
  )
  ...

然后在setContext中:

const authLink = setContext((_, prevCtx) => 
  let headers = prevCtx.headers || 

  if (!headers['Auth-Token']) 
    const token = getCookieFromBrowser(authCookieName)
    headers =  ...headers, 'Auth-Token': token 
  

  return ( headers )
)

因此,如果标头已经存在于先前的上下文中(从服务器发送时就是这种情况),则只需使用它即可。如果不存在(从浏览器发送时),从浏览器获取 cookie 并设置它。

我希望有一天它会对某人有所帮助。

【讨论】:

以上是关于如何在 NextJS 应用程序中从 Apollo 链接上下文访问 Express HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章

NextJS + Apollo:如何在 getServerSideProps 内的 apolloClient.query 上获取多个查询?

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

作为道具传递与提取缓存 Apollo 客户端 Nextjs

如何在 Android Studio 中从 Apollo Client (GraphQL) 导入生成的类

如果你有 apollo react 钩子从后端获取数据,你如何使用 nextjs 进行服务器端渲染?

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