Как обрабатывать ошибки со стеком Apollo

Я использую стек Apollo с graphql-server-express и apollo-client.

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

До сих пор моей основной проблемой была аутентификация, и поэтому я ответил с ошибкой.

return new Error(`${data.status}: ${data.statusText} @ ${data.url}`)

В интерфейсе я использую apollo-client для запроса данных.

return apollo
        .query({query: gql`
            query {
                ${query}
            }`,
            forceFetch: forceFetch
        })
        .then(result => { debugger; return result.data })
        .catch(error => { debugger; console.error(error); });

Но если одно свойство запроса отвечает ошибкой, будет вызываться только функция catch. Даже данные остальных свойств передаются, я вижу это на вкладке сети в Chrome Dev Tools. In не является объектом ошибки в функции catch.

Моя попытка отлично работает с GraphiQL, где я получаю ошибки и данные в одном и том же объекте.

Итак, как я могу выбросить ошибки для свойства без потери всего запроса?

Ответ 1

Вы можете вручную искать result.error в части then вашего обещания и избегать использования catch. Также я думаю, что вы могли бы также добавить then после вызова catch для обработки этого конкретного случая.

В дополнение к этому вы также можете использовать formatError на вашем сервере GraphQL, чтобы вручную фильтровать и форматировать сообщения об ошибках. Тело этой функции следующее, и у вас есть доступ к брошенному Error.

formatError: (error) => {
  return {
    name: error.name,
    mensaje: error.message
  }
}