我想在用户登录时在我的apollo客户端中设置令牌。
这是我的index.js:
const client = new ApolloClient({
ssrMode: SERVER_MODE,
cache: new InMemoryCache().restore(cache),
link: createUploadLink({
uri: process.env.REACT_APP_API_URL,
fetch: SERVER_MODE ? global.fetch : NetworkService.customFetch,
headers: {
Authorization: 'Bearer ' + window.localStorage.access_token,
}
}),
defaultOptions: NetworkService.defaultOptions,
});
ReactDOM.render(
<ApolloProvider client={client}>
<Router>
<App client={client}/>
</Router>
</ApolloProvider>,
document.getElementById('root')
);
问题是,当应用启动时,没有令牌,因此客户端使用令牌初始化:null。
当用户登录时,我设置了令牌,但以某种方式需要刷新我的应用程序以考虑令牌。
成功执行登录api调用后,登录功能仅将令牌保存在localStorage中。
我应该如何处理?现在,我正在登录后重新加载整个页面以绕过此问题...
答案 0 :(得分:0)
我使用了http://dev.apollodata.com/react/auth.html#Header所述的setContext
方法,它工作正常!
static authLink = setContext((_, { headers }) => {
// get the authentication token from local storage if it exists
const token = localStorage.getItem('access_token');
// return the headers to the context so httpLink can read them
return {
headers: {
...headers,
authorization: token ? `Bearer ${token}` : '',
}
};
});
...
new ApolloClient({
ssrMode: SERVER_MODE,
cache: new InMemoryCache().restore(cache),
link: ApolloLink.from([
NetworkService.authLink,
NetworkService.errorLink,
NetworkService.uploadLink
]),
defaultOptions: NetworkService.defaultOptions,
});