Как вернуть поле данных и поле ошибок с помощью запроса Graphql-kotlin - PullRequest
0 голосов
/ 22 июня 2019

Я работаю на одном сервере, который разрешает запросы GraphQL.Я использовал библиотеку graphql-kotlin: https://github.com/ExpediaDotCom/graphql-kotlin.

Я определил три функции разрешения (можно рассматривать как три поля): getxxx (arguments ...), getTarget (arguments ...) и getSource (arguments)...).

Проблема в том, что если одно из моих запрашиваемых полей не было выполнено, я получу только поле «ошибки».Все остальные успешно выполненные результаты (данные) отбрасываются.Если я попытаюсь перехватить исключение для ошибочного поля, я не получу поле «ошибка» в конце концов.

Это изображение, которое имело исключительную ситуацию и отбросило все извлеченные данные: This is the image that had exception and dropped all fetched data

Цель состоит в том, чтобы вернуть как удачно извлеченные данные в поле «данные», так и сообщение об ошибке для ошибочного поля в поле «ошибки».Я проверил это: Как вернуть и ошибку, и данные в резольвере graphql? Если я умышленно установлю поле, которое выбрасывает одну ошибку или исключение, я получу только поле 'ошибки' наконец (как на картинкевыше).

Кроме того, многие веб-сайты, подобные этому: https://itnext.io/the-definitive-guide-to-handling-graphql-errors-e0c58b52b5e1 предлагают возвращать частичный результат и сообщение об ошибке, но в моем случае, если я встретлю исключение, будет возвращено только сообщение об ошибке.

1 Ответ

1 голос
/ 26 июня 2019

В нашем примере приложения у нас есть два запроса верхнего уровня

{
  onlyCake(msg: "cake")
  generateNumber
}

Если я запускаю этот код, он возвращает случайное число, а onlyCake возвращает строку <3. Однако, если я изменю ввод onlyCake на что-то, что не является строкой cake, я получу ошибку. Это ожидается, потому что поле onlyCake имеет директиву для реализации этого поведения.

https://github.com/ExpediaDotCom/graphql-kotlin/blob/2961b64d6e4cceb4034aec198d667e5f965decd2/example/src/main/kotlin/com/expedia/graphql/sample/directives/CakeOnlyDirectiveWiring.kt#L18-L19

Screen Shot 2019-06-25 at 5 11 45 PM

Вопрос в том, что если я захочу вернуть данные еще для generateNumber, могу ли я это сделать, и в ответе есть и errors, и data?


Ответ возможен, но не с текущей схемой. Проблема заключается в том, что наша схема для onlyCake и generateNumber являются необнуляемыми полями. Поэтому, как клиент, если я вижу, что есть поле data, я должен ожидать увидеть оба поля, иначе у меня возникнет проблема с анализом в моем коде. Вот почему у нас не может быть такого поведения со схемой как есть. Если вы хотите реализовать это поведение, разработчик схемы должен решить, где он может вернуть значение null для некоторого ответа, и соответствующим образом изменить поле ошибок с помощью DataFetcherExceptionHandler

Или другой вариант - мы поддерживаем поведение в graphql-java, чтобы возвращать DataFetcherResult<T> вместо T из функций kotlin. См. Раздел Returning data and errors здесь: https://www.graphql -java.com / Документация / v13 / Выполнение /

Я создал проблему для продолжения этого обсуждения с другими членами команды: https://github.com/ExpediaDotCom/graphql-kotlin/issues/244

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...