首页 > 解决方案 > 创建客户端后(登录后)将上下文链接添加到 Apollo Link

问题描述

我想将上下文链接添加到现有客户的 Apollo Link 链中。

这是我读过的两个 GitHub 问题:FirstSecond

我不想使用本地存储来存储令牌,因为这里的文档显示。

我有一个身份验证提供程序来存储我的令牌。存储我的令牌后,我想将上下文链接添加到 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)

标签: javascriptreact-apolloapollo-client

解决方案


从 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));
};


推荐阅读