Size: a a a

GraphQL — русскоговорящее сообщество

2019 November 07

AE

Anton Egorov in GraphQL — русскоговорящее сообщество
подскажите правильный паттерн дизайна graphql: если происходит ошибка валидации данных в мутации (в резолвере уже, а не по схеме), то лучше кидать ошибку или возвращать её в payload, например, { success: false, errors: [ ... ] }?
источник

AE

Anton Egorov in GraphQL — русскоговорящее сообщество
и примерно похожая ситуация: если клиент запрашивает запись по айдишнику, а она не найдена? кидать ошибку (аналог статуса 404) или просто возвращать null как результат?
источник

K

Konstantin in GraphQL — русскоговорящее сообщество
Ребята, а поделитесь как вы работаете с локальным состоянием если оно храниться в аполло-клиенте ?
источник

K

Konstantin in GraphQL — русскоговорящее сообщество
Просто я тут попробовал делать это методами из доки (cache.writeData), но это какой то адок. Что бы поменять переменную которая в сторе лежит, мне надо знать весь колюч кэша, а это и запрос и переменные запроса. Неудобно ппц.

https://www.apollographql.com/docs/react/data/local-state/
источник

K

Konstantin in GraphQL — русскоговорящее сообщество
Поделитесь, пожалуйста опытом. Мне кажется не должно быть такого, что редакс удобней апполло.
источник

DT

Dmitry Tsepelev in GraphQL — русскоговорящее сообщество
Anton Egorov
подскажите правильный паттерн дизайна graphql: если происходит ошибка валидации данных в мутации (в резолвере уже, а не по схеме), то лучше кидать ошибку или возвращать её в payload, например, { success: false, errors: [ ... ] }?
Тут вроде бы нет стандарта, но мне нравится следующий подход:
1. Ошибки валидации в мутациях возвращаются внутри data, так как это не ошибки, а просто отклонение от “golden flow” и их можно показать пользователю (“email не может быть пустым“)
2. Настоящие ошибки (токен протух, нет прав, …) возвращаются в errors и обрабатываются, но не показываются явно (например, если токен протух – выкидываем пользователя на экран логина)
источник

DT

Dmitry Tsepelev in GraphQL — русскоговорящее сообщество
Anton Egorov
и примерно похожая ситуация: если клиент запрашивает запись по айдишнику, а она не найдена? кидать ошибку (аналог статуса 404) или просто возвращать null как результат?
Да, мне кажется null тут логично, кто-то просил данные по id, сервер не нашел и отдал “ничего"
источник

EK

Eugene Korobkov in GraphQL — русскоговорящее сообщество
Anton Egorov
и примерно похожая ситуация: если клиент запрашивает запись по айдишнику, а она не найдена? кидать ошибку (аналог статуса 404) или просто возвращать null как результат?
Лучше возвращать union: User | UserNotFoundProblem
источник

AE

Anton Egorov in GraphQL — русскоговорящее сообщество
Dmitry Tsepelev
Тут вроде бы нет стандарта, но мне нравится следующий подход:
1. Ошибки валидации в мутациях возвращаются внутри data, так как это не ошибки, а просто отклонение от “golden flow” и их можно показать пользователю (“email не может быть пустым“)
2. Настоящие ошибки (токен протух, нет прав, …) возвращаются в errors и обрабатываются, но не показываются явно (например, если токен протух – выкидываем пользователя на экран логина)
мне тоже кажется это логичным, но просто у apollo-server'а, например, есть такой типа middleware — formatError, в котором можно эти ошибки обработать в одном месте. а так получается мне нужно будет их обрабатывать в каждом резолвере.

поясню на примере:

допустим, у меня мутация по созданию юзера. у юзера должен быть указан либо email, либо телефон. насколько я понимаю, системой типов в graphql это нельзя описать, поэтому этой проверкой занимается mongoose.

я делаю:

let user = new User(args.input)
await user.save()


если там произошла ошибка валидации (не указан ни емэйл, ни телефон), оно выкинется в formatError, где я могу это централизованно обработать.

с другой стороны, если засовывать это в payload (что мне тоже больше нравится концептуально), нужно в каждом резолвере делать что-то типа:

let user = new User(args.input)
try {
 await user.save()
} catch (err) {
 // тут разные проверки  err
 return {
   success: false,
   errors: somehowFormatErrors(err)
 }
}
источник

DT

Dmitry Tsepelev in GraphQL — русскоговорящее сообщество
А можно сделать собственный тип middleware и сделать все то же самое, но чтоб попало в payload? (я просто на одном умирающем языке это делаю, не в Node 😅 )
источник

AE

Anton Egorov in GraphQL — русскоговорящее сообщество
Dmitry Tsepelev
А можно сделать собственный тип middleware и сделать все то же самое, но чтоб попало в payload? (я просто на одном умирающем языке это делаю, не в Node 😅 )
так на первый взгляд на документацию — нет
источник

SG

Suren Gorgoyan in GraphQL — русскоговорящее сообщество
Друзя у меня вопрос по генератврам. Нужно написать функцию котврая вызовится в первый 8аз запомнит аргвумнет а во вторвй раз вызовет другую функцию с первым и вторым аргументом
источник

BS

Bogdan Shelomanov in GraphQL — русскоговорящее сообщество
поясните пж, сср=тру, это на сервере выполнятся запросы, клиент получит готовую страницу, получается, всякие лоадеры не отработают, потому что небыло запрос от клиента и будет калично выглядеть страницы?
источник

x

x1dan in GraphQL — русскоговорящее сообщество
Bogdan Shelomanov
поясните пж, сср=тру, это на сервере выполнятся запросы, клиент получит готовую страницу, получается, всякие лоадеры не отработают, потому что небыло запрос от клиента и будет калично выглядеть страницы?
клиент компилит и выдает на сервер уже готовую страницу
источник

BS

Bogdan Shelomanov in GraphQL — русскоговорящее сообщество
x1dan
клиент компилит и выдает на сервер уже готовую страницу
наоборот
источник

x

x1dan in GraphQL — русскоговорящее сообщество
нет, точнее клиентская часть компилится сначала и выдает сервер уже скомпилированную страницу
источник

BS

Bogdan Shelomanov in GraphQL — русскоговорящее сообщество
ну это я и написал, но в таком случае, всякие свистоперделки не будут видны юзеру, пока сервак собирает и выполняет запросы , клиент будет видеть страницу без данных
источник

BS

Bogdan Shelomanov in GraphQL — русскоговорящее сообщество
пока это тут крестик не уберется
источник

x

x1dan in GraphQL — русскоговорящее сообщество
нет
источник

x

x1dan in GraphQL — русскоговорящее сообщество
сервер выдает уже отрендеренную страницу
источник