Open In App

How to handle server-side errors in Redux applications ?

It is essential to deal with server-side errors while building reliable Redux applications. This ensures a seamless user experience, even if problems occur during server requests. This guide will explain the effective management of server errors in the Redux architecture through Redux Thunk middleware and structured error handling techniques.

Handling Server-Side Errors in Redux Applications:

Example: Below is the example of handling server-side Errors in Redux Applications:






// index.js
import React from 'react';
import { createRoot } from 'react-dom/client';
import { Provider } from 'react-redux';
import App from './App';
import store from './store';
 
const root = createRoot(document.getElementById('root'));
 
root.render(
  <Provider store={store}>
    <App />
  </Provider>
);




// App.js
import React,
{ useEffect } from 'react';
import {
    useDispatch,
    useSelector
} from 'react-redux';
import { fetchData } from './actions/actions';
 
 
const App = () => {
    const dispatch = useDispatch();
    const { loading, data, error } =
        useSelector(state => state);
 
    useEffect(() => {
        dispatch(fetchData());
    }, [dispatch]);
 
    return (
        <div>
            {loading && <p>Loading...</p>}
            {data && (
                <div>
                    <h1>Data</h1>
                    <p>{JSON.stringify(data)}</p>
                </div>
            )}
            {error && <p>Error: {error}</p>}
        </div>
    );
};
 
export default App;




// store.js
import {
    createStore,
    applyMiddleware
} from 'redux';
// Correct import
import { thunk }
    from "redux-thunk"
import promiseMiddleware
    from 'redux-promise-middleware';
import { createLogger }
    from 'redux-logger';
import rootReducer
    from './reducers/reducer';
 
// Create logger middleware
const loggerMiddleware = createLogger();
 
// Apply middleware
const store = createStore(
    rootReducer,
    // correct use of thunk 
    applyMiddleware(
        thunk,
        promiseMiddleware,
        loggerMiddleware
    )
);
 
export default store;




// actions.js
export const fetchData = () => {
    return async (dispatch) => {
        dispatch({ type: 'FETCH_DATA_PENDING' });
        try {
            const response =
                await fetch('https://dummyjson.com/products');
            const data =
                await response.json();
            dispatch(
                {
                    type: 'FETCH_DATA_FULFILLED',
                    payload: data
                }
            );
        } catch (error) {
            dispatch(
                {
                    type: 'FETCH_DATA_REJECTED',
                    payload: error.message
                });
        }
    };
};




// reducers.js
const initialState = {
    loading: false,
    data: null,
    error: null
};
 
const reducer =
    (state = initialState, action) => {
        switch (action.type) {
            case 'FETCH_DATA_PENDING':
                return {
                    ...state,
                    loading: true,
                    error: null
                };
            case 'FETCH_DATA_FULFILLED':
                return {
                    ...state,
                    loading: false,
                    data: action.payload
                };
            case 'FETCH_DATA_REJECTED':
                return {
                    ...state,
                    loading: false,
                    error: action.payload
                };
            default:
                return state;
        }
    };
 
export default reducer;

Output:

Output




Article Tags :