How to Fix the 'Actions Must be Plain Objects' Error with Custom Middleware for Async Actions

If you're a developer, you might have come across the "Actions must be plain objects" error when working with custom middleware for async actions in Redux. This error can be frustrating and can prevent you from building your application effectively. In this guide, we'll take a look at how to fix this error using custom middleware.

What is Redux Middleware?

Redux middleware is code that sits between the action creators and the reducers. It allows you to intercept actions and do something with them before they reach the reducers. Middleware is a powerful tool that can be used to handle async actions, log actions, and more.

What is the 'Actions Must be Plain Objects' Error?

The "Actions must be plain objects" error occurs when an action is not a plain JavaScript object. In Redux, actions are typically plain objects with a type property and an optional payload property. When you try to dispatch an action that is not a plain object, you'll see the "Actions must be plain objects" error.

How to Fix the 'Actions Must be Plain Objects' Error with Custom Middleware

The best way to fix the "Actions must be plain objects" error when working with custom middleware for async actions is to use the redux-thunk middleware. redux-thunk allows you to return a function from an action creator instead of a plain object. This function can then dispatch additional actions and perform async operations.

Here's how to use redux-thunk middleware to fix the "Actions must be plain objects" error:

First, install redux-thunk using npm or yarn:

npm install redux-thunk

or

yarn add redux-thunk

In your Redux store configuration file, import redux-thunk and apply it as middleware:

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';

const store = createStore(
  rootReducer,
  applyMiddleware(thunk)
);

In your action creator, return a function that accepts dispatch as an argument:

export const fetchUser = id => {
  return dispatch => {
    dispatch({ type: 'FETCH_USER_REQUEST' });

    fetch(`/users/${id}`)
      .then(response => response.json())
      .then(user => {
        dispatch({ type: 'FETCH_USER_SUCCESS', payload: user });
      })
      .catch(error => {
        dispatch({ type: 'FETCH_USER_FAILURE', payload: error });
      });
  };
};

When calling the action creator, use dispatch to dispatch the returned function:

dispatch(fetchUser(id));

FAQ

Q: Why am I getting the "Actions must be plain objects" error?

A: You are getting this error because you are trying to dispatch an action that is not a plain JavaScript object.

Q: What is custom middleware in Redux?

A: Custom middleware sits between the action creators and the reducers and allows you to intercept actions and do something with them before they reach the reducers.

Q: What is redux-thunk middleware?

A: redux-thunk is middleware that allows you to return a function from an action creator instead of a plain object. This function can then dispatch additional actions and perform async operations.

Q: How do I install redux-thunk?

A: You can install redux-thunk using npm or yarn.

Q: How do I apply redux-thunk middleware to my Redux store?

A: You can apply redux-thunk middleware using the applyMiddleware function from Redux.

Great! You’ve successfully signed up.

Welcome back! You've successfully signed in.

You've successfully subscribed to Lxadm.com.

Success! Check your email for magic link to sign-in.

Success! Your billing info has been updated.

Your billing was not updated.