Автор оригинала: FreeCodeCamp Community Member.
Abi Noda
Если вам нравится эта статья, пожалуйста, поддержите меня, проверив Потяните напоминание , слабый бот, который отправляет вашу команду автоматическими напоминаниями для запросов на GitHub.
Одной из проблем я недавно столкнулся с работой с GraphQL и реагировать, как обрабатывать ошибки. Как разработчики, мы, скорее всего, реализовали по умолчанию 500, 404 и 403 страницы в приложениях, представленных на сервере, но выяснение, как это сделать с помощью React и GraphQL.
В этом посте я расскажу о том, как наша команда приблизилась к этой проблеме, окончательное решение мы реализовали, и интересные уроки из спецификации GraphQL.
Задний план
Проект, над которым я работал, было довольно типичное приложение Crud, построенное в Reactix, используя GraphQL, Apollo Client и Express-graphql Отказ Мы хотели обрабатывать определенные типы ошибок – например, сервер внизу – отображая стандартную страницу ошибки для пользователя.
Наша первоначальная задача выяснила наилучший способ передачи ошибок клиенту. GraphQL не использует коды состояния HTTP, такие как 500, 400, а 403. Вместо этого отзывы содержат Ошибки
Массив со списком вещей, которые пошли не так (Подробнее о Ошибки
в спецификации Speckql ).
Например, вот как выглядел наш ответ GraphQL, когда что-то сломало на сервере:
Поскольку отзывы об ошибке GraphQl возвращают код состояния HTTP 200, единственный способ определить тип ошибки было проверку Ошибки
множество. Это казалось плохой подход, потому что ошибка сообщение
Собственность содержится исключение, брошенное на сервере. Speckql spec утверждает, что стоимость сообщение
Предназначен для разработчиков, но он не указывает, должно ли значение должно быть читаемое человеком или что-то, предназначенное для программного обеспечения:
Добавление кодов ошибок в отзывы GraphQL
Чтобы решить для этого, мы добавили стандартизированные коды ошибок на наши объекты ошибок, которые могут использоваться клиентами для программных ошибок. Это было вдохновлено, как API Stripe’s Rest возвращает строку Коды ошибок В дополнение к читабельным сообщениям.
Мы определились с тремя кодами ошибок, чтобы начать: Аутентификация_Error
, Resource_not_found
и Server_Error
Отказ
Чтобы добавить их в наши ответы на график, мы передали нами собственные Форматеррор
Функция для Express-graphql, которая отображает исключения, брошенные на сервере к стандартным кодам, которые добавляются в ответ. Speckql Spec обычно Подготовьте добавление свойств до объектов ошибок , но позволяет ему, гнездив эти записи в Расширения
объект.
Наши ошибки реагирования GraphQL были затем легко классифицировать:
Пока мы разработали наш способ добавления кодов к ответам, созданным Express-graphql Apollo-Server, кажется, предлагает Подобное встроенное поведение Отказ
Страницы ошибки рендеринга с границами ошибок реагирования
Как только мы выяснили хороший способ обработки ошибок на нашем сервере, мы обратили наше внимание на клиента.
По умолчанию мы хотели, чтобы наше приложение отобразило страницу глобальной ошибки (например, страница с сообщением «Ой» что-то пошло не так) Всякий раз, когда мы столкнулись с A Server_Error
, Авторизация_Error
или Авторизация_not_found
. Отказ Тем не менее, мы также хотели, чтобы гибкость была возможность справиться с ошибкой в определенном компонент, если мы хотели.
Например, если пользователь вводил что-то в панель поиска, и что-то пошло не так, мы хотели отобразить сообщение об ошибке в контексте, а не вспыхнуть на страницу ошибки.
Для этого мы впервые создали компонент под названием Graphqlerrorhandler
это будет сидеть между Apollo-Client
‘s Запрос
и Мутация
компоненты и их дети должны быть представлены. Этот компонент проверил для кодов ошибок в ответе, бросил исключение, если он определил код, который мы заботились о:
Использовать Graphqlerrorhandler
Мы завернули аполлон-клиента Запрос
и Мутация
составные части:
Затем наш компонент функций затем использовал нашего собственного Запрос
Компонент вместо напрямую доступ к React-Apollo
:
Теперь, когда наше приложение React было бросать исключения, когда сервер вернул ошибки, мы хотели обрабатывать эти исключения и составлять их в соответствующее поведение.
Помните, более раннее, что наша цель состояла в том, чтобы по умолчанию по умолчанию отображать глобальные страницы ошибок (например, страницы с сообщением «oops что-то пошло не так»), но все же иметь гибкость для обработки ошибки локально внутри любого компонента.
Реагировать границы ошибок предоставить фантастический способ сделать это. Границы ошибок – это компоненты реагирования, которые могут поймать ошибки JavaScript в любом месте дерева своего дочернего рода, чтобы вы могли справиться с ними с пользовательским поведением.
Мы создали границу ошибки под названием Graphqlerrorboundary
Это позволит ловить любые исключения, связанные с сервером и отобразите соответствующую страницу ошибки:
Мы используем границу ошибки как обертку для всех компонентов нашего приложения:
Границы ошибок могут быть использованы глубже в дереве компонентов, если мы хотим обрабатывать ошибки в компоненте вместо рендеринга страницы ошибки.
Например, вот что это будет выглядеть, если мы хотели на заказ поведение по обращению об ошибках в нашем компоненте более раннего:
Заворачивать
GraphQL по-прежнему относительно новичок, а обработка ошибок является распространенной проблемой, в которой работают разработчики. Используя стандартизированные коды ошибок в наших ответах на GRAPHQL, мы можем сообщить об ошибках клиентам полезным и интуитивным образом. В наших приложениях React Apps границы ошибок обеспечивают отличный способ стандартизации поведения об обработке ошибок нашего приложения, пока надо иметь гибкость, когда нам это нужно.