При использовании GraphQL / Apollo Server, должно ли быть выдано сообщение об ошибке для результатов базы данных? - PullRequest
0 голосов
/ 10 февраля 2019

Если распознаватель получает пользователя из базы данных, например, и ни один пользователь не был найден, должна ли быть выдана ошибка?Какова лучшая практика для данных не найдено?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Необходимо сделать простой возврат null, а не выдавать ошибку, особенно в этом сценарии.Часть errors вашего ответа будет включать в себя два основных типа ошибок:

  • Ошибки выполнения, возникшие в результате какой-либо сгенерированной ошибки или отклоненного обещания, возникшего во время выполнения
  • Ошибки проверки ответа, возникшие в результатеиз ответа, не соответствующего схеме

В обоих этих случаях что-то плохо и неожиданно произошло на стороне сервера.Как клиент, мне, возможно, нужно зарегистрировать дефект, открыть проблему или кричать на кого-то на 3 ячейки.Но дело в том, что эти ошибки не должны происходить в обычном порядке.

С другой стороны, давайте рассмотрим поиск пользователя по его имени пользователя или другому идентификатору.Вместо того, чтобы искать, который возвращает массив пользователей, давайте предположим, что мы используем точное совпадение и возвращаем только одного пользователя.

type Query {
  user(username: String!): User
}

В подобном сценарии не найдено соответствующего пользователя в базе данных.Некоторое время, вероятно, ожидается.Пока поле имеет значение NULL, клиент будет знать, что он ожидает пользователя или NULL, и может отлично справиться с любым сценарием.

Если мы сгенерируем ошибку, поле все равно вернет NULL, но теперь мыВы также увидите ошибку в нашем массиве errors.Теперь клиенту придется выполнить дополнительную работу, чтобы определить, произошла ли ошибка из-за того, что не было найдено ни одного пользователя, или если что-то пошло не так (в конце концов, если произошла ошибка сервера, нам может потребоваться принять дополнительные меры, например, предупредитьпользователь к тому факту).Более того, наш массив errors больше не является индикатором ответа "здоровье", поскольку он может включать в себя ошибки, которые генерируются как часть нашей обычной бизнес-логики.

0 голосов
/ 11 февраля 2019

Я бы сказал, что это действительно зависит от вас и от схемы, которую вы определили.

Если у вас есть такая схема, как

type Query {
  # allow null to be returned
  user(where: FindUserInput): User
}

, вы можете вернуть ноль, если пользователь не найден.

Если ваша схема не позволяет возвращать null, как

type Query {
  # only allowed to return a valid User object
  user(where: FindUserInput): User!
}

, тогда выведите ошибку.

Я не верюСуществует абсолютная лучшая практика, больше о том, какое поведение вы ищете в своем проекте.

...