Apollo GraphQL:更改默认标题INSIDE React Child Component

时间:2018-07-14 23:03:43

标签: reactjs redux graphql apollo

我正在尝试更改Apollo Graph QL客户端 INSIDE 的默认标头,而我只是无法在文档中找到任何内容。因此,在我的index.js中,我按照说明创建并链接了客户端,并添加了JWT Token标头。但是,如果我想更改React组件中的标题,该怎么办?例如,我要在重新认证时替换令牌。

在Axios中,您可以执行此操作。

axios.defaults.headers.common['Auth-Token'] = 'foo bar';

如何使用React Apollo做类似的事情?这是他在我的index.js中的重要组成部分

const httpLink = createHttpLink({
    uri: 'https://somesecureapi',
});

const authLink = setContext((_, { headers }) => {

const token = localStorage.getItem('token');
return {
    headers: {
        ...headers,
        authorization: token ? `Bearer ${token}` : "",
    }
}
});

const client = new ApolloClient({
    link: authLink.concat(httpLink),
    cache: new InMemoryCache()
});

我尝试导出客户端,然后将其导入到组件中,创建一个新的Link并更改旧的Link,但这无效。

必须有一些更简单的方法。任何建议

1 个答案:

答案 0 :(得分:1)

createHttpLink接受fetch选项,您可以在其中自定义fetch的行为方式。一个简单的实现可能看起来像这样:

import { ApolloProvider, graphql } from "react-apollo";
import { ApolloClient } from "apollo-client";
import { InMemoryCache } from "apollo-cache-inmemory";
import { ApolloLink } from "apollo-link";
import { createHttpLink } from "apollo-link-http";

const customFetch = (uri, options) => {
  return fetch(uri, {
    ...options,
    headers: {
      ...options.headers,
      "x-custom-header": "custom value"
    }
  });
};

const fetchLink = createHttpLink({
  uri: "https://graphql-pokemon.now.sh",
  fetch: customFetch
});

const client = new ApolloClient({
  link: ApolloLink.from([fetchLink]),
  cache: new InMemoryCache()
});

如您在customFetch中所见,我在x-custom-header上加上了"custom value"。这将应用于使用此客户端的所有查询。但是,我也将options.headers扩展到fetch选项中,因此所有传入的标头都将通过。

在我们的组件中,我们可以像这样传递额外的标题:

const WrappedPokemon = graphql(PokemonQuery, {
  options: {
    context: { headers: { "x-another-custom-header": "another custom value" } }
  },
  props: ({ data }) => ({
    loading: data.loading,
    pokemon: data.pokemon || {}
  })
})(Pokemon);

与上面的一个不同,此额外的标头仅适用于该查询。

我在codesandbox中做了一个简单的实现,以帮助您了解实现。

结果如下所示: The custom headers are getting passed through, yay!