Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 错误:操作必须是普通对象。使用自定义中间件进行异步操作Redux_Javascript_Reactjs_Redux_React Redux - Fatal编程技术网

Javascript 错误:操作必须是普通对象。使用自定义中间件进行异步操作Redux

Javascript 错误:操作必须是普通对象。使用自定义中间件进行异步操作Redux,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,我得到一个错误:动作必须是普通对象。使用自定义中间件进行异步操作。 经过紧张的搜索仍未能解决这一问题。我正在尝试从本地存储获取令牌。令牌在那里,但无法使其工作 因此,我的代码如下所示: 我的App.js import React, { useEffect } from 'react'; import { BrowserRouter, Route, Switch } from 'react-router-dom'; import { Provider } from 'react-redux'; i

我得到一个错误:动作必须是普通对象。使用自定义中间件进行异步操作。 经过紧张的搜索仍未能解决这一问题。我正在尝试从本地存储获取令牌。令牌在那里,但无法使其工作

因此,我的代码如下所示:

我的App.js

import React, { useEffect } from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import { Provider } from 'react-redux';
import store from './redux/store';

import MainLayout from '../src/components/layout/MainLayout/MainLayout';
import Landing from '../src/components/views/Landing/Landing';
import Login from '../src/components/features/Login/Login';
import Register from '../src/components/features/Register/RegisterContainer';
import Alerts from '../src/components/common/Alerts/AlertsContainer';

import { setAuthToken } from './utils/utils';
import { loadUser } from './redux/AuthReducer';

const App = () => {
  useEffect(() => {
    setAuthToken(localStorage.token);
    store.dispatch(loadUser());
  }, []);

  return (
    <Provider store={store}>
      <div>
        <BrowserRouter>
          <MainLayout>
            <Route exact path='/' component={Landing} />
            <section className='container'>
              <Alerts />
              <Switch>
                <Route exact path='/register' component={Register} />
                <Route exact path='/login' component={Login} />
              </Switch>
            </section>
          </MainLayout>
        </BrowserRouter>
      </div>
    </Provider>
  );
};

export default App;

我的减速机

import axios from 'axios';
import { setAlert } from './AlertReducer';
import { setAuthToken } from '../utils/utils';

/* action name creator */
const reducerName = 'auth';
const createActionName = (name) => `app/${reducerName}/${name}`;

/* action types */

export const REGISTER_SUCCESS = createActionName('REGISTER_SUCCESS');
export const REGISTER_FAIL = createActionName('REGISTER_FAIL');
export const USER_LOADED = createActionName('USER_LOADED');
export const AUTH_ERROR = createActionName('AUTH_ERROR');

/* action creators */

export const registerSuccesAction = (payload) => ({
  payload,
  type: REGISTER_SUCCESS,
});
export const registerFailAction = (payload) => ({
  payload,
  type: REGISTER_FAIL,
});
export const userLoadSuccess = (payload) => ({
  payload,
  type: USER_LOADED,
});
export const userAuthError = (payload) => ({
  payload,
  type: AUTH_ERROR,
});

/* actions THUNK */
//load user
export const loadUser = () => {
  return async (dispatch) => {
    if (localStorage.token) {
      dispatch(setAuthToken(localStorage.token));
    }
    try {
      const res = await axios.get('/api/auth');
      dispatch(userLoadSuccess(res.data));
    } catch (err) {
      dispatch(userAuthError({ name: 'AUTH_ERROR' }));
    }
  };
};

//post user
export const registerUser = ({ name, email, password }) => {
  return async (dispatch) => {
    const config = {
      headers: {
        'Content-Type': 'application/json',
      },
    };
    const body = JSON.stringify({ name, email, password });
    try {
      const res = await axios.post(
        '/api/users',
        //http://localhost:8000/api/users
        body,
        config
      );

      dispatch(registerSuccesAction(res.data));
    } catch (err) {
      const errors = err.response.data.errors;
      // console.log(err.response.request._response);

      if (errors) {
        errors.forEach((error) => dispatch(setAlert(error.msg, 'danger')));
      }
      dispatch(registerFailAction({ name: 'REGISTER_FAIL' }));
    }
  };
};

/* initial state */

const initialState = {
  //store toke in localstorage
  token: localStorage.getItem('token'),
  isAuthenticated: null,
  loading: true,
  user: null,
};

/* reducer */

export default function reducer(state = initialState, action) {
  switch (action.type) {
    // register
    case REGISTER_SUCCESS:
      localStorage.setItem('token', action.payload.token);
      return {
        ...state,
        ...action.payload,
        isAuthenticated: true,
        loading: false,
      };
    case REGISTER_FAIL:
    case AUTH_ERROR:
      localStorage.removeItem('token');
      return {
        ...state,
        token: null,
        isAuthenticated: null,
        loading: false,
      };
    //user loading
    case USER_LOADED:
      return {
        ...state,
        isAuthenticated: true,
        loading: false,
        user: action.payload,
      };
    default:
      return state;
  }
}
我正在使用Thunk,但仍然无法使其工作。我发现的大多数解决方案都是关于人们在使用效果上缺少“()”的

谢谢你的帮助

还有一件事 我试图在一个类组件中这样做,但这并没有让我更接近于解决这个问题

//编辑 这是setAuthToken

import axios from 'axios';

// set global default header for token stored in localstorage
export const setAuthToken = (token) => {
  if (token) {
    axios.defaults.headers.common['x-auth-token'] = token;
  } else {
    delete axios.defaults.headers.common['x-auth-token'];
  }
};


我想a有一个想法:你能介绍一下setAuthToken函数的实现吗。我要求您这样做,因为您正在使用dispatch调用此函数,但如果它未声明为Redux操作(返回另一个函数的函数),则您会遇到此类错误是正常的。done setAuthToken addedI似乎是正确的。尝试直接调用setAuthToken,而不使用dispatch-检查loadUser函数:只需删除围绕setAuthToken函数的dispatch(),然后告诉我它是否有效。PS:这同样适用于您尝试使用dispatch.yes调用的所有其他普通函数,而不是redux操作。这是工作!!!我很高兴我帮了忙。请投票支持我的评论,因为它们可能对其他人也有用。:)我想a有一个想法:你能介绍一下setAuthToken函数的实现吗。我要求您这样做,因为您正在使用dispatch调用此函数,但如果它未声明为Redux操作(返回另一个函数的函数),则您会遇到此类错误是正常的。done setAuthToken addedI似乎是正确的。尝试直接调用setAuthToken,而不使用dispatch-检查loadUser函数:只需删除围绕setAuthToken函数的dispatch(),然后告诉我它是否有效。PS:这同样适用于您尝试使用dispatch.yes调用的所有其他普通函数,而不是redux操作。这是工作!!!我很高兴我帮了忙。请投票支持我的评论,因为它们可能对其他人也有用。:)
import axios from 'axios';

// set global default header for token stored in localstorage
export const setAuthToken = (token) => {
  if (token) {
    axios.defaults.headers.common['x-auth-token'] = token;
  } else {
    delete axios.defaults.headers.common['x-auth-token'];
  }
};