Доступ к ответу сервера при возникновении ошибки в моем саге-запросе - PullRequest
0 голосов
/ 12 февраля 2020

Я использую библиотеку redux-saga-requests для сетевого взаимодействия и управления состоянием высокого уровня. Следуя указаниям документации , я настроил глобальный обработчик ошибок для отображения уведомления в случае истечения времени ожидания запроса к серверу или проблем с подключением пользователя.

Однако, когда я получить ошибку сервера (например, 500), я не могу получить доступ к ответу в своем действии. Ответ сервера просто отсутствует.

Есть ли способ получить доступ к этому объекту, оставаясь в рамках правил и правил redux-saga?

Вот начальная настройка хранилища - обратите внимание, что onErrorSaga не дает мне сетевой ответ, поэтому я мог бы также go с поведением по умолчанию - посылать действие _ERROR с суффиксом, которое может быть поймано моим редуктором:


function* onErrorSaga(error, action) {
    console.log('error?', error)
    console.log('action?', action)

    // None of these contain the server response, 
    // just the error message and stack thrown by the client.

    yield { error }
}

function* rootSaga(axiosInstance) {
    yield createRequestInstance({
        driver: {
            default: createAxiosDriver(axiosInstance),
        },
        onError: onErrorSaga,
    })
    yield watchRequests()
}

const configureStore = initialState => {
    const sagaMiddleware = createSagaMiddleware()
    const middlewares = [thunkMiddleware, requestsPromiseMiddleware({ auto: true }), sagaMiddleware, trackingMiddleware]
    const store = createStore(rootReducer, initialState, composeWithDevTools(applyMiddleware(...middlewares)))

    sagaMiddleware.run(rootSaga, axiosInstance)

    return store
}

export const configureStoreAsync = () => {
    return new Promise((resolve, reject) => {
        const store = configureStore()
        store
            .dispatch(fetchAppInitialization())
            .then(result => resolve(store))
            .catch(e => reject(store))
    })
}

Вот как В настоящее время я обрабатываю ошибки в моем состоянии (которое затем отображается компонентом уведомления):


import { CLOSE_NOTIFICATION } from '../actions/actions.notification'

export default (state = [], action) => {
    if (action.type.endsWith('_ERROR')) {
        return {
            type: 'warning',
            title: action.error.message,
            message: `${action.error.stack.substring(0, 200)}...`,
            open: true,
            timestamp: new Date(),
        }
    }
    switch (action.type) {
        case CLOSE_NOTIFICATION:
            return {
                ...state,
                open: false,
            }
        default:
            return state
    }
}


1 Ответ

0 голосов
/ 18 февраля 2020

Оказывается, это было намного проще, чем я думал. Объект action на самом деле содержит ответ сервера.

Путь к ответу:

action.error.response.data

...