在Apollo客户端中,成功完成突变后,如何使用标头执行refetchQueries?

时间:2019-01-27 11:13:47

标签: reactjs graphql apollo-client

我在Apollo客户上遇到了一些麻烦,想知道是否有人可以在这里帮助我。

在成功向我返回了承载令牌的突变后,如何重新运行查询(带有标头)?

我发现有一个叫做refetchQueries的东西,但是它似乎忽略了所有标头,因此也忽略了我的不记名令牌。

说我的登录组件有以下突变:

<Mutation
  mutation={LOGIN_USER}
  refetchQueries={[{
    query: GET_USER,
  }]}
>
  {(loginUser, { loading, error, data }) => {
    if (data) {
      cookies.set('token', data.loginUser.token)
    }
    return (
      <form...

和我的App.js中的以下authLink:

const authLink = setContext((_, { headers }) => {
  const token = cookies.get('token')

  return {
    headers: {
      ...headers,
      authorization: token  ? `Bearer ${token}`  : null
    },
  }
})

问题似乎是使用refetchQueries时authLink不能正常工作(不发送头)。当我刷新浏览器时,我的查询工作正常,因为然后使用cookie来获取令牌,但是refetchQueries似乎不会发生这种情况。

那么在突变后的标头中带有不记名令牌的情况下如何运行查询?或者有更好的方法吗?

欢呼

1 个答案:

答案 0 :(得分:0)

我不知道您如何定义查询和变异,但是refetchQueries可以使用字符串数组来命名要重新获取的查询。我发现这很适合我的需求。为此,您需要命名查询。在gql标记内,像

一样声明您的查询
const GET_USER = gql`
query getUser($id: ID) {
  user(id: $id) {
    name
  }
}
`

然后您仅使用['getUser']调用refetchQueries

关于将Apollo设置为在每个请求上自动设置授权标头,只需查看docs

中的示例

向下滚动到有关中间件的部分