Как записать сообщение об ошибке GraphQL в Relay?

На моем сервере моя реализация GraphQL использует Flask, Graphene и SQLAlchemy. В идеале я хотел бы иметь возможность просто манипулировать заголовками и возвращать ответ об ошибке 401, но GraphQL возвращает все как 200.

Используя flask.abort (401), я, по крайней мере, могу получить этот ответ:

...
"errors": [
  {
    "message": "401 Unauthorized: The server could not verify that you are authorized to access the URL requested.  You either supplied the wrong credentials (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.",
    "locations": [
      {
      "line": 11,
      "column": 3
      }
    ]
  }
]
...

Я вижу в этом компромисс, над которым я могу работать на данный момент. Тем не мение; потому что ничто не может быть настолько простым ... Я не уверен, как я могу получить это сообщение об ошибке. Я читал, что может быть проблема с самим QueryRenderer, который проглатывает эти ошибки GraphQL, но мне удается перехватить их в объекте Network в _4 _..., который, по сути, выглядит примерно так.

Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: {…}}
  __proto__: Promise[
    [PromiseStatus]]: "resolved"
    [[PromiseValue]]: Object
      data: {viewer: {…}}
      errors: Array(4)
        0: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
        1: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
        2: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
        3: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
      length: 4
      __proto__: Array(0)
    __proto__:Object

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

Кстати, я использую Relay Modern, если это не было очевидно. Так что, скорее всего, никакие решения, основанные на Relay Classic, не будут применяться.

Изменить: сообщение об ошибке в сторону, моей мотивацией для этого была правильная обработка токенов JWT. Я думаю, что решение, которое я ищу, связано не с обработкой этих ответов об ошибках, а скорее с расширением моего понимания JWT.

Я не понимал, что мой клиент легко сможет декодировать JWT с помощью такого пакета, как jwt-decode, который затем дает мне доступ к информации об истечении срока действия ... что в конечном итоге, как я предвижу, приведет меня к некоторой форме реализации промежуточного программного обеспечения, которое оценило бы количество времени, оставшееся на JWT, и необходимость обновления.


person Scot Matson    schedule 08.08.2017    source источник


Ответы (3)


Вы можете обработать ошибки сервера в обратном вызове onCompleted: https://github.com/facebook/relay/pull/1938/files

person tkymtk    schedule 18.08.2017
comment
Как использовать этот onCompletedcallback? Это доступно на Relay Modern? Доступен ли он и по запросам? - person Mendes; 27.10.2017
comment
Он доступен на Relay Modern. Я не могу описать использование больше, чем документ. Это для мутаций. Это то, что я упустил, когда ответил на вопрос. - person tkymtk; 28.10.2017

Надеюсь, я правильно понимаю ваш вопрос, но ваш QueryRenderer должен иметь объект ошибки, содержащий ошибку https://facebook.github.io/relay/docs/query-renderer.html

render={({error, props}) => {
if (error) {
  return <div>{error.message}</div>;
} else if (props) {
  return <div>{props.page.name} is great!</div>;
}
return <div>Loading</div>;
person liminal18    schedule 22.08.2017
comment
Эти ошибки предполагают, что приложение не отказало. Оказывается, мне все-таки не нужно разбираться с сообщениями об ошибках, но, к вашему сведению, это относится к ошибкам среды на сетевом уровне, которые обычно приводят к критическим сбоям приложения. К сожалению, у меня нет фрагмента, который можно было бы продемонстрировать. - person Scot Matson; 23.08.2017
comment
хорошо, это интересно, поэтому ошибка QueryRender срабатывает только в некоторых случаях, а некоторые ошибки сетевого уровня не распространяются на QueryRenderer? Это интересно. Спасибо за информацию. - person liminal18; 23.08.2017
comment
Ошибка QueryRenderer отображается только в том случае, если данные полезной нагрузки GraphQL равны нулю, иначе она проглотится .... - person Mendes; 27.10.2017

В environment.js измените функцию fetch так, чтобы если в ответе JSON существует массив errors, вы выдавали бы его как новую настраиваемую ошибку. Эта выданная ошибка будет передана в QueryRenderer, где она будет доступна как error prop. Обработайте это там, показывая связанный с ошибкой пользовательский интерфейс, если ошибка присутствует.

См. Этот комментарий на GitHub для подробного объяснения: https://github.com/facebook/relay/issues/1913#issuecomment-470541691

person Omkar Rajam    schedule 07.04.2019