Как стать автором
Обновить

Комментарии 14

Насколько удобно работать с ошибками? Применялись ли какие-то дополнительные библиотеки на сервере или на клиенте для работы с ошибками? Ведь в стандартном случае graphql выдает ошибки аналогичные stacktrace.


Я хочу прояснить что я имею в виду. В REST я могу например выдать ошибку в которой передать например message которое будет выдано клиенту в виде всплывающего окна. Либо передать поле status c кодом ошибки в котором клиент по зараннее заданному списков кодов ошибки выберет вариант взаимодействия с пользователем. Или если это ошибка валидации входных данных, то в REST я могу выдать список полей с описанием ошибок во входных данных. Всего этого нет в стандартном graphql который в случае ошибки выдает текст, генерацией которого мы не можем управлять.

Ошибки, валидацю можно и нужно передавать в привычном виде. То что выдаётся как стектрейс это только ошибка с синтаксисом запроса или же проблема типа.

Вы имеете в виду что каждый тип выходного объекта должен включать в себя поле error/errors? А сам объект возвращать в поле data/payload и т.п.?


У меня в основном к этой идее идут мысли. Но это сразу все усложняет.
Плюс если правильный ответ это как правило один тип. А ошибок может быть несколько типов. Как минимум ошибка с зараннее оговоренным статусом, ошибка в которой передается необрабатываемый на клиенте текст сообщения, и ошибка валидации входных параметров.

Да. Но для запросов вам никаких ошибок или валидаций делать не надо. Потому это все усложнение будет касаться только мутаций. А мутация может возвращать результат в виде составного объекта. Там будет объект и какая-то механика для ошибок.


Подход стандартный в том сервере что используем мы django-graphene и не вызвал каких-то проблем привыкания.

Генерацией текста ошибки управлять можно. За это отвечает поле «formatError» в структуре конфигурации обработки запроса, используемой в graphqlHTTP(...). Можно также вставлять свои поля. Вот пример из работающего кода. Правда, используется не Apollo, a graphql и express-graphql.

app.use('/api', auth.validateTokenMiddleware, graphqlHTTP((req, res) => {
___ return {
___ ___ schema: apiModulesManager.gqlSchema,
___ ___ pretty: true,
___ ___ context: { req, res, dataloaders: buildDataloaders() },
___ ___ formatError
___ };
}));

function formatError(err) {
___ log.error(err);
___ return {
___ ___ // standard fields:
___ ___ message: err.message,
___ ___ path: err.path,
___ ___ locations: err.locations,

___ ___ // extended fields:
___ ___ code: err.code || 'not classified error',
___ ___ localizedMessage: err.locMessage || `not localized: ${err.message}`
___ };
}


Для того, чтобы всё это работало, в нужных местах кидаются исключения с необходимыми полями.

P.S. Отступы в коде были безжалостно пожраны хабром. Пришлось извращаться с "___ " :(

P.P.S. Естественно, речь идёт об ошибках, полученных во время выполнения функциональной части запроса, а не при парсинге текста запроса (то бишь синтаксических ошибках в тексте запроса).

Рекомендую к прочтению https://github.com/nodkz/conf-talks. Идея в том, что надо использовать свои типы-ошибки для возврата бизнесовых ошибок через Union. Стандартный errors использовать только для технических ошибок (500-ые)

Из статьи неясна мотивация перехода на GraphQL, поподробнее бы это осветить.

По прочтению данной статьи у меня сложилось мнение, что цель автора — описать само решение и технические проблемы, возникшие при выполнении поставленной задачи. Соответственно, я не рассчитываю найти в ней ответы на вопросы, почему же эта задача была поставлена именно так, были ли альтернативы и т.п.

Neveil вот, например, статья, которая могла бы послужить мотивацией: habr.com/ru/post/470097
Мотивацией являлась поставленная задача, которая должна была быть оценена и выполнена в соответствие с этой оценкой. А так, как уже описывалось в статье, на текущее API присылает множество лишних данных, которые мы просто не используем, переход на GraphQL, в дальнейшем позволит обеспечить приложение только нужными данными.

Почему какие-то "спринты" вообще рассматриваются как фактор?

Ознакомьтесь с методом управления проектом SCRUM. Я не говорю, что мы работаем в точности по данному методу, но как можно заметить, «спринты» ограничены сроками. Почему сроки не могут являться этим «фактором»?

Сроки — вторичный фактор. Главное — "что произойдет, если 'срок' пройден?" Что-то мне подсказывает, что будет новый срок.

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

Публикации