I've encountered this error and spent the last few hours trying to figure it out. I've looked at all the questions that appear to be duplicates - but they don't solve the issue.
In my react/redux app, when I made an ajax request in one of my actions, it throws this error out:
Uncaught Error: Actions must be plain objects. Use custom middleware for async actions.
My store creation looks like this:
import { composeWithDevTools } from 'redux-devtools-extension';
import reducers from './reducers';
import thunkMiddleware from 'redux-thunk';
import { applyMiddleware, createStore } from 'redux';
export default createStore(reducers, composeWithDevTools(
applyMiddleware(thunkMiddleware)
));
The relevant reducer looks like this:
import * as actions from './../../actions/tools/vehicle-lookup';
const defaultState = {
vrm: void 0,
isLoading: false,
response: void 0,
error: void 0,
};
export default function (state = defaultState, action) {
switch (action.type) {
case actions.VEHICLE_LOOKUP:
return { ...state, isLoading: true, vrm: action.vrm };
case actions.VEHICLE_LOOKUP_SUCCESS:
return { ...state, isLoading: false, payload: action.payload, error: void 0 };
case actions.VEHICLE_LOOKUP_FAILURE:
return { ...state, isLoading: false, error: action.error, response: void 0 };
default: return state;
}
}
The relevant action looks like this:
import axios from 'axios';
export const VEHICLE_LOOKUP = 'VEHICLE_LOOKUP';
export const VEHICLE_LOOKUP_SUCCESS = 'VEHICLE_LOOKUP_SUCCESS';
export const VEHICLE_LOOKUP_FAILURE = 'VEHICLE_LOOKUP_FAILURE';
export function fetchVehicleLookup(vrm: string, jwt: string) {
return function (dispatch) {
dispatch(requestVehicleLookup());
axios.create({
timeout: 4000,
})
.post('/*api url*', {
action: '*method*',
body: { vrm },
})
.then(response => response.data)
.then(json => dispatch(receiveVehicleData(json)))
.catch(error => dispatch(receiveVehicleDataFailure(error)));
};
}
function requestVehicleLookup() {
return { type: VEHICLE_LOOKUP };
}
function receiveVehicleData(payload: object) {
return { type: VEHICLE_LOOKUP_SUCCESS, payload };
}
function receiveVehicleDataFailure(error: object) {
return { type: VEHICLE_LOOKUP_FAILURE, error };
}
My package versions are:
"axios": "^0.16.0",
"react": "^15.4.2",
"react-addons-css-transition-group": "^15.5.0",
"react-addons-transition-group": "^15.5.0",
"react-dom": "^15.4.2",
"react-hot-loader": "^3.0.0-beta.6",
"react-redux": "^5.0.3",
"react-router": "^4.0.0",
"react-router-dom": "^4.0.0",
"redux": "^3.6.0",
"redux-devtools-extension": "^2.13.0",
"redux-promise": "^0.5.3",
"redux-promise-middleware": "^4.2.0",
"redux-thunk": "^2.2.0",
First thought was that your fetchVehicleLookup
action was moaning because you are returning the axios
instead of just dispatching within.
export function fetchVehicleLookup(vrm: string, jwt: string) {
return function (dispatch) {
dispatch(requestVehicleLookup());
axios.create({
timeout: 4000,
})
.post('/*api url*', {
action: '*method*',
body: { vrm },
})
.then(response => response.data)
.then(json => dispatch(receiveVehicleData(json)))
.catch(error => dispatch(receiveVehicleDataFailure(error)));
};
}
Simply remove the return
statement that is in your action, as it's returning whatever object axios represents, which I imagine is going to be some form of Promise
.
Second thought could be something around your store setup because it sounds like thunk
isn't actually working.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With