Обновите заголовки ApolloClient после его инициализации - PullRequest
1 голос
/ 29 апреля 2019

Мое приложение упаковано с <Apollo /> компонентом, который по сути инициализирует клиента.

const client = new ApolloClient({
  link: new HttpLink({
    // ...
  }),
  cache: new InMemoryCache({
    // ..
  }),
});

В дальнейшем пользователи дороги могут выполнить определенное действие, требующее от меня установки нескольких новых заголовков для клиента apollo, которые не былитам до.Сначала я думал использовать контекст реакции для этого, чтобы передать набор новых заголовков и использовать их внутри <Apollo />, но не уверен, что это правильный путь.

После просмотра документов, кажется,что заголовки apollo могут быть установлены только при инициализации?

1 Ответ

1 голос
/ 29 апреля 2019

Вместо того, чтобы передавать заголовки непосредственно в ваш экземпляр клиента Apollo, вы обычно хотите использовать apollo-link-context.Вы можете хранить фактические значения заголовка в памяти, LocalStorage или в любом другом месте, которое имеет смысл для вашего приложения.Затем используйте ссылку, чтобы вставить их в каждый запрос перед его отправкой:

const headerLink = setContext((request, previousContext) => ({
  headers: {
    // Make sure you include any existing headers!
    ...previousContext.headers,
    authorization: localStorage.getItem('authHeader')
  },
}));

const client = new ApolloClient({
  link: headerLink.concat(httpLink),
  cache: new InMemoryCache()
});

setContext может быть асинхронным.Функция, которую вы передаете, должна возвращать либо объект с полями контекста, которые вы хотите изменить, либо Promise, который разрешается в одно:

const headerLink = setContext(async (request, previousContext) => {
  const authorization = await someAsyncCall()
  return {
    headers: {
      ...previousContext.headers,
      authorization,
    },
  }
});

Вы можете проверить документы длядополнительные примеры.

...