首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apollo链接响应头

Apollo链接响应头
EN

Stack Overflow用户
提问于 2017-11-23 05:04:34
回答 2查看 8.3K关注 0票数 12

我在一个简单的React应用程序中使用最新版本的Apollo客户端,并尝试从用于显示返回的记录集大小的响应中提取一个标头值。

我知道这不是提供结果集大小的最好方法,但这就是目前API的设置方式。

我希望使用中间件类型选项来完成此操作,但当我检查响应对象时,似乎无法提取任何头文件。

网络跟踪确实显示响应头与预期一致,因此我怀疑我误解了如何获取所需的底层对象。

我已经检查了文档,但没有什么是显而易见的,因此出现了这个问题……

EN

回答 2

Stack Overflow用户

发布于 2019-11-22 10:13:30

后端响应时,headers应包括:

Access-Control-Expose-Headers: * //或refreshToken字段的名称

下面是完整的代码:

前端:(Apollo & React)

代码语言:javascript
复制
const httpLink = new HttpLink({ uri: URL_SERVER_GRAPHQL })

// Setup the header for the request
const middlewareAuthLink = new ApolloLink((operation, forward) => {
  const token = localStorage.getItem(AUTH_TOKEN)

  const authorizationHeader = token ? `Bearer ${token}` : null
  operation.setContext({
    headers: {
      authorization: authorizationHeader
    }
  })
  return forward(operation)
})



//After the backend responds, we take the refreshToken from headers if it exists, and save it in the cookie.
const afterwareLink = new ApolloLink((operation, forward) => {
  return forward(operation).map(response => {
    const context = operation.getContext()
    const {
      response: { headers }
    } = context

    if (headers) {
      const refreshToken = headers.get('refreshToken')
      if (refreshToken) {
        localStorage.setItem(AUTH_TOKEN, refreshToken)
      }
    }

    return response
  })
})

const client = new ApolloClient({
  link: from([middlewareAuthLink, afterwareLink, httpLink]),
  cache: new InMemoryCache()
})

在后端(express)。如果我们需要刷新令牌(例如:因为实际的令牌即将过期)

代码语言:javascript
复制
const refreshToken = getNewToken()
res.set({
   'Access-Control-Expose-Headers': 'refreshToken', // The frontEnd can read refreshToken
   refreshToken
})

文档来源:https://www.apollographql.com/docs/react/networking/network-layer/#afterware

票数 24
EN

Stack Overflow用户

发布于 2017-11-25 04:56:55

在这里找到了答案:https://github.com/apollographql/apollo-client/issues/2514

必须通过操作上下文访问它...有趣的是,dev工具显示headers对象是空的,但是您可以从其中拉出命名的headers……

代码语言:javascript
复制
const afterwareLink = new ApolloLink((operation, forward) => {
  return forward(operation).map(response => {
    const context = operation.getContext();
    const { response: { headers } } = context;

    if (headers) {
      const yourHeader = headers.get('yourHeader');
    }

    return response;
  });
});
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47443858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档