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

Общаемся на темы, посвященные GraphQL и опыту его использования. Проблемы. Новости. Решения. Вам могут быть полезны: @apollo_ru, @react_js, @vuejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание в чате было полезным и комфортным.

352 members

Архив канала @graphql_ru 25 марта 2018 г.

08:12:33 ДП
User 144022504
User 321317845
это очевидно
почему очевидно?
10:08:04 ДП
User 321317845
что АПИ гитхаба скрывается за аутентификацией?
10:08:47 ДП
User 321317845
потому что любое апи для сайтиков скрывается за ней
10:29:20 ДП
User 91770096
User 89599420
решил это все тем что на клиете при запуске сессии делаю запрос на viewer который возвращает инфу о текущем юзере, и если вернет нул то перенаправляю на логин скрин.
Спасибо за помощь)
но ты не можешь это делать перед каждым запросом. Если в один момент запрос вернул Нулл. Это нет данных или авторизация слетела?
10:33:11 ДП
User 89599420
в рутовский еррор еще пишу  сообщение в формате "status:message"
вообще авторизация слетит только если юзер зайдет в локалсторедж и сам удалит токен, но проблема решится перезагрузкой страницы
11:11:32 ДП
User 530735
User 89599420
в рутовский еррор еще пишу  сообщение в формате "status:message"
вообще авторизация слетит только если юзер зайдет в локалсторедж и сам удалит токен, но проблема решится перезагрузкой страницы
каким образом перезагрузка решит проблему?
11:18:48 ДП
User 89599420
это будет считатся как новая сессия и приложение при запуске сделает запрос на viewer и так как токена уже не будет, то аутентификацию юзер не пройдет и его отправят на логин скрин
или можно при запросе если возникнет ошибка, то парсить сообщение ошибки со сплит(:) и если статус будет 401 то переводить на логинскрин (но это конечно же если всегда офрмлять сообщение ошибки "статус:текс", по другому я не знаю как сделать кастомные обьект ошибки в графине...)
11:21:40 ДП
User 530735
что-то всё так сложно... почему в каком-нибудь beforeRoute не проверять наличие токена в локалсторадже и либо добавлять его в headers, либо отсылать на логин?
зачем что-то парсить?
11:22:18 ДП
User 89599420
токен может быть просроченым
11:23:36 ДП
User 530735
ну так ты статус(401) тогда возвращай, а не парси строки
11:23:55 ДП
User 89599420
так нельзя же
11:24:01 ДП
User 530735
чойта?
11:24:24 ДП
User 89599420
графкл сервер всегда 200 или 500 возвращает по спецификации
11:24:33 ДП
User 89599420
разве нет?
11:24:57 ДП
User 89599420
и все данные должны быть в теле ответа
11:25:08 ДП
User 89599420
по статусам толтко рест работает
11:25:29 ДП
User 530735
а, бл... тож графкл... тогда на стороне графкл сделай throw new GraphQLError('My amazing error string.')
11:26:18 ДП
User 530735
а на клиентской стороне ты получишь error в объекте. вот его message и бери
11:26:19 ДП
User 89599420
вот так и делаю) только еще статус в префиксе допилмваю
11:26:45 ДП
User 530735
короч, чот я не догнал твой велосипед ))
11:27:03 ДП
User 89599420
User 530735
а на клиентской стороне ты получишь error в объекте. вот его message и бери
просто с самим текстом сложно работать, сообщение ж может поменяться
11:27:11 ДП
User 89599420
а статус всегда один
11:27:46 ДП
User 530735
User 89599420
просто с самим текстом сложно работать, сообщение ж может поменяться
что-то ты явно не то делаешь
11:29:15 ДП
User 89599420
я так и не нашел как люди обрабатывают ошибки на клиенте, неужели действительно просто по тексту сообщения ошибки?
11:31:45 ДП
User 91770096
что мешает кидать и код
11:31:59 ДП
User 91770096
свой собственный
11:39:55 ДП
User 530735
в объекте GraphQLError  есть свойство extensions, посмотри, может тебе подойдет
11:40:19 ДП
User 530735
https://github.com/graphql/graphql-js/blob/master/src/error/GraphQLError.js#L99
github.com/graphql/graphql-js/blob/master/src/error/GraphQLError.js
graphql-js - A reference implementation of GraphQL for JavaScript
11:59:11 ДП
User 89599420
User 530735
https://github.com/graphql/graphql-js/blob/master/src/error/GraphQLError.js#L99
github.com/graphql/graphql-js/blob/master/src/error/GraphQLError.js
graphql-js - A reference implementation of GraphQL for JavaScript
у меня бекэнд на питоне джанго+графин, и там у обьекта ошибки такая сигнатура: def __init__(self, message, nodes=None, stack=None, source=None, positions=None, locations=None) и ничего не задокументировано, и судя по трейсбеку даже если я кидаю этот тип ошибки то он перекинется и от оригинальной ошибки возмет только сообщение, так что расширить обьект ошибки никак не получается...
12:00:22 ПП
User 89599420
а так выглядит текущие ответы на запрос с аусом и без
12:00:23 ПП
12:00:23 ПП
12:01:21 ПП
User 530735
User 89599420
у меня бекэнд на питоне джанго+графин, и там у обьекта ошибки такая сигнатура: def __init__(self, message, nodes=None, stack=None, source=None, positions=None, locations=None) и ничего не задокументировано, и судя по трейсбеку даже если я кидаю этот тип ошибки то он перекинется и от оригинальной ошибки возмет только сообщение, так что расширить обьект ошибки никак не получается...
класс ошибки графина должен, по идее, расширять стандартный класс Error. А ты уже можешь расширить ошибку графина. с питоном у меня не сложилось, поэтому только предположения
12:02:52 ПП
User 89599420
какую б ошибку я не бросил графин все перебрасывает в свой тип ошибки, так что переопределить не получится(
12:07:09 ПП
User 530735
я не заню как у вас в питоне, но у нас можно так:
class MySuperError extends GraphQLError { ... }
далее при наступлении ошибки, генери new MySuperError('...') Всё! Графин должен прокинуть именно твой класс.
12:09:23 ПП
User 89599420
а в графине так:
try: 
  resolve_stuff(bla, foo)
except Exception as e:
  raise GraphQLError(str(e))
тоесть чтобы я не срайзил внутри resolve_stuff оно всегда сконце вернет дефолтный GraphQLError
12:10:00 ПП
User 530735
User 89599420
а в графине так:
try: 
  resolve_stuff(bla, foo)
except Exception as e:
  raise GraphQLError(str(e))
тоесть чтобы я не срайзил внутри resolve_stuff оно всегда сконце вернет дефолтный GraphQLError
замени GraphQLError на свой класс
12:10:06 ПП
User 89599420
в доках графкла пишут что нула в дате и сообщения в эрроре должно быть достатовно чтоб описать любую ситуацию
и тут байрон подтверждает https://github.com/graphql/graphql-js/issues/560
так что наверно можно оставить все как есть
github.com/graphql/graphql-js/issues/560
I am very interested to know how to talk with the client with custom errors. For example, if you create a new user and the user email already exists on the database, the API has to be able to reply...
12:10:16 ПП
User 89599420
User 530735
замени GraphQLError на свой класс
это код из библиотеки
12:10:23 ПП
User 89599420
сорцы придется переписывать)
12:10:41 ПП
User 530735
User 89599420
сорцы придется переписывать)
зачем ??? ))))))
12:11:25 ПП
User 89599420
всмысле внутри либы все это делается и из приложения и меня есть власть только над resolve_stuff
12:11:29 ПП
User 530735
как в питоне делается extends классу?
12:12:25 ПП
User 89599420
я понимаю что ты предлагаешь, просто графин всегда переделует любую ошибку под свою
12:14:20 ПП
User 530735
йобушки воробушки... залез на свою голову посмотреть как у вас там классы расширяются...

Аминь!
12:15:08 ПП
User 89599420
так расширяются ж изи:
class Child(Base): pass
12:20:12 ПП
User 530735
ну так расширь и используй
12:20:39 ПП
User 89599420
всмысле внутри либы все это делается и из приложения и меня есть власть только над resolve_stuff
12:20:39 ПП
User 89599420
я понимаю что ты предлагаешь, просто графин всегда переделует любую ошибку под свою
03:10:09 ПП
User 144022504
User 321317845
потому что любое апи для сайтиков скрывается за ней
а если я query запросы не скрываю за ней, то чем это может грозить?
03:43:29 ПП
User 89599420
User 144022504
а если я query запросы не скрываю за ней, то чем это может грозить?
на самом деле любое открытое апи должно иметь защиту, например если какой-то плохой юзер решит спамить запросами, то сервер может либо тротлить их подстраиваясь под юзера, либо заблокировать этого юзера. Блочить по айпи не вариант потому что могут быть и другие юзеры под этим айпи. Если у тебя закрытое апи, и его может юзать только твой же клиент, и на сервере правильно выставленны ALLOWED_HOSTS под этот клиент, то можно с эти не заморачиватся
03:53:30 ПП
User 144022504
User 89599420
на самом деле любое открытое апи должно иметь защиту, например если какой-то плохой юзер решит спамить запросами, то сервер может либо тротлить их подстраиваясь под юзера, либо заблокировать этого юзера. Блочить по айпи не вариант потому что могут быть и другие юзеры под этим айпи. Если у тебя закрытое апи, и его может юзать только твой же клиент, и на сервере правильно выставленны ALLOWED_HOSTS под этот клиент, то можно с эти не заморачиватся
спасибо)
07:11:03 ПП
User 321317845
апишка - это некоторая возможность оперирования кодом
07:11:17 ПП
User 321317845
если веб морду можно закешить
07:11:28 ПП
User 321317845
скрыть за варнишем
07:11:36 ПП
User 321317845
ну или ещё что
07:12:19 ПП
User 321317845
то плохо построенная gql апишка может положить сервак одним запросом
07:12:49 ПП
User 321317845
а js реализация буквально пропогандирует n+1
07:13:34 ПП
User 321317845
т.е. один gql запрос может создать 100500 SQL запросов и гг
07:16:15 ПП
User 321317845
Ах да, если кому интересно - приходите: https://habrahabr.ru/company/badoo/blog/351828/
habrahabr.ru/company/badoo/blog/351828
UPD. Места уже расхватали, но будет трансляция. Приглашения участникам скоро вышлем! Привет, Хабр! Похоже, астрологи объявили неделю PHP митапов в апреле :)...
07:16:39 ПП
User 321317845
там про graphql будет доклад
10:05:46 ПП
User 530735
User 89599420
я понимаю что ты предлагаешь, просто графин всегда переделует любую ошибку под свою
Раз: https://github.com/graphql-python/graphene/issues/513

Два: https://github.com/graphql-python/graphene/issues/141
10:27:00 ПП
User 89599420
User 530735
Раз: https://github.com/graphql-python/graphene/issues/513

Два: https://github.com/graphql-python/graphene/issues/141
да, спасибо, я уже успел форматирование ошибки через переопределение класса вьюшки (а не класса ошибки) заюзать, из 141 ишью)
10:27:19 ПП
User 89599420
так что сейчас уже не приходится коды парсить
10:27:39 ПП
User 530735
User 89599420
да, спасибо, я уже успел форматирование ошибки через переопределение класса вьюшки (а не класса ошибки) заюзать, из 141 ишью)
👍
10:29:20 ПП
User 530735
кстати, посмотри еще разницу authenticated и authorized, что-то мне подсказывет, что правильнее в этом случае второе. хотя код не видел
10:30:01 ПП
User 89599420
authorized это когда нет прав (403)
10:30:17 ПП
User 89599420
authenticated это когда юзер не идентифицирован (401)
10:30:35 ПП
User 530735
тогда верно ;)