Перехватить ошибки API - PullRequest
       8

Перехватить ошибки API

0 голосов
/ 27 июня 2018

Я использую response-admin со стандартными параметрами crud, я хочу реагировать на RA/CRUD_GET_LIST_FAILURE (и все остальные в будущем), чтобы выйти из системы пользователя, если ошибка 401 (например, когда токен истек)

Как я должен это сделать? По индивидуальным запросам у меня есть собственные саги, которые обрабатывают это в части catch и правильно выполняют свою работу.

Если я попытаюсь перехватить RA/CRUD_GET_LIST_FAILURE следующим образом:

function * loadingErrorRA (action) {
  var e = action.payload;
  console.error('loadingError',action);
  if(action.error === "Unauthorized"){ 
  //I can't find a better way because I don't have access to the fetch response object in here
    yield put(userLogout());
    yield put(showNotification('Disconnected','warning'));
  } else {
    yield put(showNotification('Error '+action.error,'warning'));
  }
}

function * errorLoadingSaga() {
  yield takeLatest('RA/CRUD_GET_LIST_FAILURE', loadingErrorRA);
}

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

ListController.js:417 Uncaught TypeError: Cannot read property 'list' of undefined
    at Function.mapStateToProps [as mapToProps] (ListController.js:417)
    at mapToPropsProxy (wrapMapToProps.js:43)
    at handleNewPropsAndNewState (selectorFactory.js:34)
    at handleSubsequentCalls (selectorFactory.js:67)
    at pureFinalPropsSelector (selectorFactory.js:74)
    at Object.runComponentSelector [as run] (connectAdvanced.js:26)
    at Connect.componentWillReceiveProps (connectAdvanced.js:150)
    at callComponentWillReceiveProps (react-dom.development.js:11527)
   ....
index.js:2178 The above error occurred in the <Connect(TranslatedComponent(undefined))> component:
    in Connect(TranslatedComponent(undefined)) (created by List)
    in List (created by WithStyles(List))
    in WithStyles(List) (at SalesByOrganismList.js:40)
    in div (at SalesByOrganismList.js:39)
    in SalesByOrganismList (created by WithPermissions)
    in WithPermissions (created by Connect(WithPermissions))
    in Connect(WithPermissions) (created by getContext(Connect(WithPermissions)))
    ...

And then saga catch it with :
index.js:2178 uncaught at loadingErrorRA TypeError: Cannot read property 'list' of undefined
    at Function.mapStateToProps [as mapToProps] 
    ...

Спасибо за помощь

1 Ответ

0 голосов
/ 27 июня 2018

https://marmelab.com/react-admin/DataProviders.html#error-format

Когда API-интерфейс возвращает ошибку, поставщик данных должен выдать объект Error. Этот объект должен содержать свойство status с кодом ответа HTTP (404, 500 и т. Д.). React-admin проверяет этот код ошибки и использует его для аутентификации (в случае ошибок 401 или 403). Кроме того, activ-admin отображает сообщение об ошибке на экране во временном уведомлении.

А https://marmelab.com/react-admin/Authentication.html#catching-authentication-errors-on-the-api

Каждый раз, когда API возвращает ошибку, вызывается authProvider с типом AUTH_ERROR. Опять же, вы сами решаете, какие коды состояния HTTP должны позволить пользователю продолжить (путем возврата разрешенного обещания) или выйти из него (путем возврата отклоненного обещания).

...