У меня есть пример приложения React / Apollo для codesandbox , которое пытается обработать действия по выходу из системы / подписке с подпиской (на примере сервера Hasura GraphQL с включенной аутентификацией JWT). Рабочий процесс показан на скриншотах ниже (чтобы воспроизвести, проверить журналы и нажать кнопку выхода; при необходимости обновите sh Предварительный просмотр).
I пытался справиться с этим, сбрасывая соединение websocket каждый раз, когда он должен либо очистить подписку (выйти), либо повторить попытку (войти) (wsLink.subscriptionClient.close(false, false)
). Но errorLink
(промежуточное ПО Apollo) больше не вызывается после выхода из системы, поэтому я не знаю, как правильно его перехватить, чтобы вызвать вход / повторную подписку. Тем не менее, компонент продолжает получать ошибки. Ошибка где-то есть, но ссылка на ошибку не знает об этом.
Если ошибка может быть обнаружена ссылкой на ошибку, я могу подключить все логи c, которые я хочу повторно подтвердить, и я счастлив.
На самом деле здесь есть 2 вопроса:
- Как я могу убедиться, что ссылка на ошибку продолжает перехватывать ошибки после выхода из системы (здесь: сброс websocket)?
- Каков наилучший способ обработки входа / выхода с помощью веб-сокета Apollo, если не использовать этот подход? (В идеале я хотел бы остаться на той же странице SPA, прервать подписку, очистить локальные данные, показать диалоговое окно входа и после входа в систему восстановить подписки и данные.)
Редактировать: В то же время я попытался с RetryLink, и, похоже, работает: попытки подписки ловятся, давая возможность ловить, аутентифицировать и повторно подписываться. Но я не уверен, что это действительно хороший подход для обработки входа / выхода. Рекомендации о том, как справиться с этим, приветствуются. Вот обновленная песочница .
Исходная попытка:
Первоначальный рендеринг :
Рендеринг после нажатия кнопки выхода и журналы с указанием шагов:
Примечание. Сервер Graphql - это пример приложения hasura, размещенного на Heroku с включенной аутентификацией JWT. Клиентское приложение имеет JWT, действительный в течение многих лет.