在React Redux中使用rsaa中间件时操作未定义

时间:2018-08-16 04:47:16

标签: reactjs redux jwt redux-thunk

我使用this guide通过来自jwt rest框架的Django令牌认证来使用我的api设置认证。我可以登录。但目前,我设置了另一个端点来获取当前授权用户的用户信息(由他们随请求发送的令牌确定)。

它的发送方式是这样的(用户登录后一段时间)

fetchUser: () => dispatch(loadUser()),

我的操作以加载用户名:

import { RSAA } from 'redux-api-middleware';
import withAuth from '../reducers'

export const USER_REQUEST = '@@user/USER_REQUEST';
export const USER_SUCCESS = '@@user/USER_SUCCESS';
export const USER_FAILURE = '@@user/USER_FAILURE';

export const loadUser = () => ({
    [RSAA]: {
        endpoint: '/api/user/info/',
        method: 'GET',
        headers: withAuth({}),
        types: [
            USER_REQUEST, USER_SUCCESS, USER_FAILURE
        ]
    }
});

减速器

import jwtDecode from 'jwt-decode'
import * as user from '../actions/user'

const initialState = {};

export default (state=initialState, action) => {
    switch(action.type) {
        case user.USER_SUCCESS:
            return action.payload;
        default:
            return state
    }
}
export const userInfo = (state) => state.user;

减速器index.js

export function withAuth(headers={}) {
    return (state) => ({
        ...headers,
        'Authorization': `Bearer ${accessToken(state)}`
    })
}

export const userInfo = state => fromUser.userInfo(state.user);

但是当我尝试获取已登录用户的用户信息时,出现错误。

  

TypeError:无法读取未定义的属性“ type”

extended error information

为什么未定义操作类型?

注意:我用thunk标记了它,因为我的项目确实使用thunk,但不是用于redux。

编辑:我的middleware.js和我的store.js

1 个答案:

答案 0 :(得分:0)

问题在于,在store.js中,thunkredux-api-middleware中间件之前被应用。

只需将其移动到以下位置即可:

const store = createStore(
        reducer, {},
        compose(
            applyMiddleware(apiMiddleware, thunk, routerMiddleware(history)),
            window.devToolsExtension ? window.devToolsExtension() : f => f,
        ),
    );