Как обрабатывать 401 ошибки в приложении Redux/React
Я создаю сайт с React и Redux, и у меня есть запрос о том, как я должен обрабатывать 401 ответ состояния.
В настоящее время, когда API сообщает о состоянии HTTP 401, он обычно попадает в одно из моих действий, и я отправляю:
return dispatch({
type: 'FETCH_MONTHLY_DATA_FAILURE',
error: response.data
});
и связанный редуктор проверяет код состояния HTTP, и у меня есть промежуточное по Redux, которое проверяет это значение состояния HTTPStatus и реагирует соответствующим образом.
есть ли более элегантный способ справиться с этим ошибки в общем виде? Я использую Axios для своих HTTP-запросов.
2 ответов
Вы сказали :
и связанный редуктор проверяет код состояния HTTP...
использование промежуточного ПО отлично, но редуктор не должен проверять состояние http. это было бы вне его цели.
с документация :
задание редуктора-указать, как изменяется состояние приложения в ответ.
ваши создатели действий должны быть чисто, все асинхронные коды должны жить где-то еще.
побочные эффекты не принадлежат в редукторах
есть много способов сделать это. Все сводится к предпочтениям.
вот 3 способа обработки HTTP-запросов более элегантным способом:
Вариант 1 (самый мощный) : генераторы, саги и сложные цепочки асинхронных операций
redux-saga позволяет сделать именно это. Я лично используйте это промежуточное ПО для обработки вызовов и ответов api.
ментальная модель заключается в том, что сага похожа на отдельную нить в вашем приложение, которое несет полную ответственность за побочные эффекты. обертывание-сага промежуточное по redux, что означает, что этот поток может быть запущен, приостановлен и отмены от основного приложения с нормальными действиями, я полагаю, он имеет доступ к полному состоянию приложения redux, и он может отправить redux действия что ж.
вот преимущества, которые я получаю от использования этой опции:
- изолировать код побочных эффектов в одном домене приложения (sagas)
- композиция из нескольких саг (комплекс с обещаниями)
- уменьшает действие шаблона обещания
- создатели чисты настолько легче проверить!
упростить реализацию вариантов использования, таких как:
в большом многопользовательском, мульти-отдел блог, если пользователь когда-либо нажмите на кнопку" подписаться на RSS-канал", затем в следующий раз пользователь посещает раздел, который имеет выделенный RSS-канал, показать ему / ей предложение подписаться на ленту этого раздела.
в онлайн-среде IDE, если пользователь никогда не использовал определенную функцию заявление, но прибыло в государство, что вышеупомянутое функция потенциально может быть полезна, показать диалоговое окно справки этот особенность.
в stackoverflow, пока пользователь отвечал на вопрос, вопрос был изменен OP, поэтому вы сообщаете пользователю, что вопрос был изменен, и ответ потенциально больше не существует действительный.
etc.
redux-observable другой вариант :
создание и отмена асинхронных действий для создания побочных эффектов и многое другое.
2 : поместите интеллект, который управляет асинхронными операциями в операциях приложения в actions creators
redux-promise или redux-thunk хорошие образцы.
пока все хорошо. Мы удалили соединение, отделили нашу асинхронную логику где-то еще и имеем чистую архитектуру. Однако более продвинутая функция redux-saga упростит сложные варианты использования.
вот суть redux thunk :
асинхронный промежуточного слоя вместе подумать и вместе обещают обертывания метод dispatch () магазина и позволяет отправлять что - то другое чем действия, например, функции или обещания. Любое промежуточное вас использование может интерпретировать все, что вы отправляете, и, в свою очередь, может пройти действия для следующего промежуточного ПО в цепочке. Например, обещание промежуточное ПО может перехватывать обещания и отправлять пару begin/end действия асинхронно в ответ на каждое Обещать.
Вариант 3: Управление побочными эффектами через компоненты более высокого порядка
компоненты более высокого порядка (HOCs) - это функции JavaScript, которые добавляют функциональность к существующим классам компонентов. Просто как реагируют компоненты позволяют добавить функциональность в приложение, компонент высших порядков позволяют добавить функциональность компонентов. Можно сказать, что это компоненты для компонентов.
не подходит для всех случаев использования !
Exemple: axios, HTTP-клиент на основе обещания для браузера и узла.js
Вариант 4: генераторы и обещания, без саг
и последнее, но не менее важное: вы все еще можете использовать генераторы для управления асинхронным потоком управления в frontend без добавления зависимости redux-thunk, если вам не нужны некоторые из его дополнительных функций.
добавить глобальный перехватчик ответов, который отправляет действие при возникновении ошибки
import store from './store';
// Add a response interceptor
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
store.dispatch({
type: 'API_ERROR',
payload: error,
})
return Promise.reject(error);
});
// In you reducers...
reduce(state, action) {
if (action.type === 'API_ERROR' && action.payload.statusCode === 401) {
return { // whatever needed }
}
return state;
}