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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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!
}

тогда выбрасывание ошибки - путь.

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

Другие вопросы по тегам