Как правильно вернуть ошибку в useMutation из обработчика api?

Есть у меня api сервис, в нем реализован метод через который идут все запросы, типа:

async request({
    method,
    endpoint,
    data,
    params,
    headers,
    responseType,
    type = 'rest',
  }) {
       if (this.expireAt < Date.now() && !endpoint.includes('authorization')) {
        throw tokenExpired;
       }
    try {
      const req = await this.instanceTypes[type].request({
        method,
        url: endpoint,
        data,
        params,
        responseType: responseType || 'json',
        headers: {
          Authorization: this.token,
          ...headers,
        },
      });

      return req.data.data || req.data;
    } catch (e) {
      console.error(e);
      if (e.response?.status === 400 && e.response?.data?.code === 'WrongCredentials') {
        throw tokenExpired;
      }
      throw 'Api service not found';
    }
  }

Также есть хук, в котором используется useMutation и вызывается в определенный момент:

export const useGetAssetbox = () => {
  const { setIsTokenExpired } = useContext(Context);

  return useMutation((resourceName) => ApiService.requestRest({
    method: 'GET',
    endpoint: '/assetbox',
    params: { count: 100, resourceName }
  }), { onError: () => setIsTokenExpired(true) });
};

Все нормально отрабатывает, ошибка как бы обрабатывается (setIsTokenExpired(true), но помимо всего также появляется ошибка реакта поверх всего сайта введите сюда описание изображения

Подскажите, пожалуйста, как правильно выбросить ошибку из моего апи сервиса, чтобы useMutation ее адекватно обработала и реакт не выкинул ошибку? Пробовал вместо throw использовать return (чтобы вернуть ошибку в мутацию), но тогда мутация не идентифицирует этот ответ как ошибку и считает что запрос успешно выполнился. Как указать мутации что это error ответ, а не success? throw, который перед try{} catch{} работает нормально. Если он выкидывает ошибку, то она нормально отрабатывается и react не выбрасывает уведомление о необработанной ошибке.


Ответы (0 шт):