Как я могу поймать RelayObervable Необработанную ошибку, когда возвращаются ошибки graphql? - PullRequest
0 голосов
/ 28 августа 2018

Мой сервер возвращает следующий ответ:

const errorMessage = {
  errors: [
    {
      message: 'User is logged out',
    },
  ],
  data: null,
};
return res.status(200).json(errorMessage);

Мое приложение реагирующего на родство, использующее реле, возвращает следующую ошибку:

RelayObservable: Unhandled Error Error: 
Relay request for `HomeQuery` failed by the following reasons:

Эта ошибка появляется, когда я пытаюсь выполнить запрос к бэкэнду, и возвращает приведенный выше массив ошибок errorMessage graphql. У меня нет способа отловить эту ошибку в моем слое ретрансляционной сети ДО того, как он сгенерирует красный экран. Моя среда ретрансляции выглядит так:

const network = new RelayNetworkLayer([
  urlMiddleware({
    url: () => Promise.resolve(`${config.endpoint}backend`),
    headers: async () => authenticateHeaders(fetchHeaders),
  }),
  retryMiddleware({ fetchTimeout: 1000 }),
  next => req => {
    if (!req.uploadbles) {
      req.Accept = 'application/json';
      req['Content-Type'] = 'application/json';
    }

    return next(req);
  },
  next => async req => {
    const res = await next(req);
    if (isLoggedOut(res)) {
      // Using react-navigation, route to the login screen
      dispatch(routeToLogin())
      // I also tried returning `dispatch(routeToLogin())` and `{ data: null, errors: res.payload.errors }` without luck
    }

    return res;
  }
  ]);

Есть ли способ навигации по dispatch(routeToLogin()), не видя ошибки красного экрана при возврате ошибок graphql?

Редактировать 1

Для react-relay-network-modern: Вы можете добавить опцию noThrow следующим образом: new RelayNetworkLayer(middlewares, { noThrow: true });

Опция noThrow не существует для react-relay-network-layer (relay classic), могу ли я что-нибудь сделать, чтобы обойти ее?

1 Ответ

0 голосов
/ 04 сентября 2018

Пожалуйста, попробуйте noThrow вариант:

const network = new RelayNetworkLayer(middlewares, { noThrow: true });
...