我可以覆盖组件中单个查询的 Apollo Client 标头吗?

Posted

技术标签:

【中文标题】我可以覆盖组件中单个查询的 Apollo Client 标头吗?【英文标题】:Can I override Apollo Client headers from individual queries in my components? 【发布时间】:2020-01-13 16:06:25 【问题描述】:

当我初始化我的 Apollo 客户端时,我创建了一个带有标题 hello: "world" 的 Apollo 链接。有没有办法使用钩子覆盖组件中的hello 标头值?我认为这会起作用,但它仍然使用 Client 标头:

useQuery(<QUERY>,
    context:
        headers:
            hello: "Canada"
        
    
)

【问题讨论】:

【参考方案1】:

我在尝试覆盖请求的授权标头时遇到了同样的问题。当我在链接中设置标题时,我通过传播operation.getContext().headers 解决了这个问题。代码:

const authLink = new ApolloLink((operation, forward) => 
    operation.setContext(
      headers: 
        authorization: authToken,
        ...operation.getContext().headers,
      ,
    );

    return forward(operation);
  );

那么您包含的代码应该可以按预期工作。

【讨论】:

【参考方案2】:

您的代码似乎正确。经过一些测试后,似乎无法覆盖现有的标头。

  const  data, loading, error  = useQuery(ALL_GAMES, 
    context:  headers:  authentication: 'some value', test: 'some value'  
  );

也许如果您将一个全新的客户端传递给 useQuery - 您可以使用工厂函数创建客户端

【讨论】:

以上是关于我可以覆盖组件中单个查询的 Apollo Client 标头吗?的主要内容,如果未能解决你的问题,请参考以下文章

Vue Apollo Query 不覆盖本地数据

如何测试graphql apollo组件?如何在 compose() 中获得完整的覆盖?

React/Apollo - 不同组件中的类似查询?

无法在单个 GraphQL 查询中组合本地和远程数据(Next.js + Apollo)

Vue-apollo 从另一个组件重新获取查询

如何将数据从反应组件传递到 Apollo graphql 查询?