При использовании 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!
}
тогда выбрасывание ошибки - путь.
Я не верю, что есть абсолютная лучшая практика, это больше о том, какое поведение вы ищете в своем проекте.