Как получить тело ошибки с помощью React Apollo Link Rest - PullRequest
1 голос
/ 01 октября 2019

Я создаю приложение React с использованием Apollo Graphql, и у меня возникли некоторые проблемы с Apollo Link Rest. Проблема заключается в том, что в середине моего приложения я должен сделать запрос REST, однако этот запрос может быть успешным и вернуть код состояния = 200, или может произойти сбой, возвращая код состояния = 400.

Этодля моего приложения важно показать конечному пользователю сообщение об ошибке, которое возвращается в теле этого запроса в случае ошибки 400. Однако, когда происходит ошибка, Apollo Link Rest просто генерирует исключение, но не возвращает мне тело ответа.

Есть ли способ получить тело ответа, когда возникает ошибка сАполлон Ссылка Отдых? Я думал, что смогу получить его из переменной result, но поскольку Apollo выдает исключение, эта переменная никогда не меняется.

Вот мой код:

    const result = await context.client.query<MyQuery>({
      query: MyQuery,
      variables: {
        input: {
          companyId: variables.companyId,
        },
      },
    });
query MyQuery($input: MyQueryInput!) {
  myQuery(input: $input) @rest(
    type: "QueryResponse",
    method: "POST"
    path: "v1/my-query"
  ) {
    id
    minimumPreparationTime
    maximumPreparationTime
    extras {
      id
      optional
      key
    }

    warning
    error {
      id
      type
      message
    }
  }
}

1 Ответ

0 голосов
/ 03 октября 2019

Вы можете использовать apollo-link-error для перехвата и обработки ошибок сервера, сетевых ошибок и ошибок GraphQL. Вы должны иметь возможность условно установить response.errors, если это необходимо.

    import { onError } from "apollo-link-error";

    const link = onError(({ graphQLErrors, networkError, response, operation }) => 
    {
       if (graphQLErrors)
       graphQLErrors.map(({ message, locations, path }) =>
           console.log(
            `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: 
            ${path}`,
          ),
        );

     if (networkError) console.log(`[Network error]: ${networkError}`);

    response.error = // set error property here 
});

Также стоит отметить, что Apollo предлагает параметр errorPolicy, для которого по умолчанию используется значение none. Политику можно изменить на all, что, согласно документам,

- лучший способ уведомить ваших пользователей о потенциальных проблемах, при этом отображая как можно больше данных с вашего сервера. Он сохраняет как данные, так и ошибки в Apollo Cache, чтобы ваш пользовательский интерфейс мог их использовать.

...