javascript - 创建客户端后(登录后)将上下文链接添加到 Apollo Link
问题描述
我想将上下文链接添加到现有客户的 Apollo Link 链中。
这是我读过的两个 GitHub 问题:First,Second。
我不想使用本地存储来存储令牌,因为这里的文档显示。
我有一个身份验证提供程序来存储我的令牌。存储我的令牌后,我想将上下文链接添加到 Apollo 客户端的链接
const authLink = setContext((_, { headers }) => {
const newHeaders = { ...headers };
if (token) newHeaders.authorization = `Bearer ${token}`;
return {
headers: newHeaders,
};
});
我知道我可以通过useClient
. 如何在创建客户端之前将此链接附加到我的组件中已经存在的客户端而不这样做?
link: authLink.concat(httpLink)
或者link: authLink.concat(whateverLinksApolloHas)
解决方案
从 Apollo Client v3.0.0 开始,您现在可以setLink
在 Apollo Client 创建后使用该方法更新链接链(请参阅 Changelog Section v3)。
Apollo Client 现在支持在调用 new ApolloClient() 后使用 ApolloClient#setLink 方法设置新的 ApolloLink(或链接链)。@hwillson 在 #6193
但是,除此之外,我还没有找到任何关于它的文档。
我无法使用setContext
. 相反,它看起来像是替换了整个链接链,所以这是我使用@apollo/client@3.2.5
.
import { ApolloClient, HttpLink, NormalizedCacheObject } from '@apollo/client/core';
import { setContext } from '@apollo/client/link/context';
import fetchNewToken from 'your-token-function-file'
const replaceLinkChainOnClient = (client: ApolloClient<NormalizedCacheObject>, url: string) => {
const httpLink: HttpLink = new HttpLink({
uri: url
});
const link = setContext(async (operation, prevContext) => {
const token = await fetchNewToken();
return {
...prevContext,
headers: {
...prevContext.headers,
Authorization: `Bearer ${token}`
}
};
});
client.setLink(link.concat(httpLink));
};
推荐阅读
- javascript - 如何将具有特定键、深度键的 JSON 对象中的所有值放入数组中
- php - 返回 JSON 响应而不是 401 Blade 文件
- nlog - 未找到 NLog MessageBox 目标
- excel-formula - excel 修剪功能正在删除文本中间的空格 - 这是出乎意料的(?)
- api - Chrome DevTools 在执行之前批准网络请求
- plugins - device_calendar 0.1.0 插件,用于限制日历访问权限
- google-drive-api - 阻止 Google Drive File Stream 立即同步已删除的文件
- mongodb - 查询最后的设备文档
- haskell - 关于 Haskell 列表 monoid 的实现
- spring-data - Spring Data JDBC 中的乐观锁