Уловка React-Apollo, когда сервер не работает - PullRequest
4 голосов
/ 27 мая 2020

В моем приложении React ApolloGraphQL с сервером узлов я пытаюсь заставить его отлавливать ошибки, когда мой сервер узла не работает. Все работает отлично и нормально, когда используется сервер узла ... ошибки graphQL обнаруживаются и отображаются. Но когда я останавливаю сервер узла, я получаю ошибку времени выполнения, которой не могу избежать. Когда сервер узла не работает, сервер отвечает ответом 503 Service Unavailable и страницей html, отличной от JSON.

Клиент apollo настроен следующим образом:

const client = new ApolloClient({
  assumeImmutableResults: true,
  fetchOptions: {
    credentials: "include"
  },
  fetch: fetch,
  onError: ({ graphQLErrors, networkError }) => {
    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 = {errors:null};
  },
  cache: new InMemoryCache({
    freezeResults: true,
    dataIdFromObject: obj => {
      let dataId = null;
      switch (obj.__typename) {
        default:
          dataId = defaultDataIdFromObject(obj);
      }
      return dataId;
    },
    cacheRedirects: {
      Query: {
        productVariant: (_, args, { getCacheKey }) => {
          const cacheKey = getCacheKey({ __typename: "ProductVariant", ...args });
          return cacheKey;
        }
      }
    },
  }),
});

Вышеупомянутый ответ блока onError с этим сообщением:

Error: Network error: JSON.parse: unexpected character at line 1 column 1 of the JSON data

У меня мутация настроена следующим образом:

const [mutateVariant, {data, error, loading}] = useMutation(UPDATE_PRODUCT_META);

И я называю это так:

mutateVariant({ variables: {inputM: {...buildMetaInput(editedData)} }, 
    errorPolicy: 'ignore', onError: (error) => Logger("Error:", error)});

Как видите, я пробовал это с разными настройками errorPolicy и добавлял обратный вызов onError.

Но я продолжаю получать необработанные ошибки времени выполнения и, похоже, способен их перехватывать и обрабатывать:

Unhandled Runtime Error

Error: Network error: JSON.parse: unexpected character at line 1 column 1 of the JSON data
Call Stack
ApolloError           webpack-internal:///./node_modules/apollo-client/bundle.esm.js (76:28)
error                 webpack-internal:///./node_modules/apollo-client/bundle.esm.js (1041:48)
notifySubscription    webpack-internal:///./node_modules/zen-observable/lib/Observable.js (140:18)
onNotify              webpack-internal:///./node_modules/zen-observable/lib/Observable.js (179:21)
error                 webpack-internal:///./node_modules/zen-observable/lib/Observable.js (240:15)
error/<               webpack-internal:///./node_modules/apollo-client/bundle.esm.js (880:76)
error                 webpack-internal:///./node_modules/apollo-client/bundle.esm.js (880:27)
notifySubscription    webpack-internal:///./node_modules/zen-observable/lib/Observable.js (140:18)
onNotify              webpack-internal:///./node_modules/zen-observable/lib/Observable.js (179:21)
error                 webpack-internal:///./node_modules/zen-observable/lib/Observable.js (240:15)
error                 webpack-internal:///./node_modules/apollo-link-error/lib/bundle.esm.js (53:34)
notifySubscription    webpack-internal:///./node_modules/zen-observable/lib/Observable.js (140:18)
onNotify              webpack-internal:///./node_modules/zen-observable/lib/Observable.js (179:21)
error                 webpack-internal:///./node_modules/zen-observable/lib/Observable.js (240:15)
createHttpLink/</</<  webpack-internal:///./node_modules/apollo-link-http/lib/bundle.esm.js (92:26)

возвращенные error данные из ловушки useMutation:

graphQLErrors: Array []
message: "Network error: JSON.parse: unexpected character at line 1 column 1 of the JSON data"
​networkError: {…}
​  ​bodyText: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>503 Service 
  Unavailable</title>\n</head><body>\n<h1>Service Unavailable</h1>\n<p>The server is temporarily unable 
  to service your\nrequest due to maintenance downtime or capacity\nproblems. Please try again later.  
  </p>\n<p>Additionally, a 503 Service Unavailable\nerror was encountered while trying to use an 
  ErrorDocument to handle the request.</p>\n</body></html>\n"
  name: "ServerParseError"
​​  response: Object {  }
​​  statusCode: 503

Как мне отловить эту ошибку?

1 Ответ

1 голос
/ 29 мая 2020

Функция mutateVariant возвращает обещание. Попробуйте добавить .catch () после его вызова.

mutateVariant().catch(() => {...});
...