我正在尝试更改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,但这无效。
必须有一些更简单的方法。任何建议
答案 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中做了一个简单的实现,以帮助您了解实现。