将提取动作转换为axios动作

时间:2019-06-25 22:15:44

标签: reactjs axios fetch

我正在尝试将我的操作从提取更新为axios。

例如,我当前的登录名如下:

export const login = (email, password) => {
  return (dispatch) => {
    dispatch({
      type: 'CLEAR_MESSAGES'
    });
    return fetch('/login', {
      method: 'post',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        email: email,
        password: password
      })
    }).then((response) => {
      if (response.ok) {
        return response.json().then((json) => {
          dispatch({
            type: 'LOGIN_SUCCESS',
            token: json.token,
            user: json.user
          });
          cookie.save('token', json.token, { expires: moment().add(1, 'hour').toDate() });
          browserHistory.push('/account');
        });
      } else {
        return response.json().then((json) => {
          dispatch({
            type: 'LOGIN_FAILURE',
            messages: Array.isArray(json) ? json : [json]
          });
        });
      }
    });
  };
}

到目前为止,转换到axios的过程是这样的:

export const login = (email, password) => {
    // const { email, password } = this.props;

    (dispatch) => {
    dispatch({
        type: 'CLEAR_MESSAGES'
    })
    axios({
        method: 'post',
        url: '/login',
        data: { email: email, password: password }
    }).then((response) => {
        dispatch({
        type: 'LOGIN_SUCCESS',
        token: json.token,
        user: json.user
        });
        cookie.save('token', json.token, { expires: moment().add(1, 'hour').toDate() });
        browserHistory.push('/account');
    })
    .catch(() => dispatch({
        type: 'LOGIN_FAILURE',
        messages: Array.isArray(json) ? json : [json]
        })
    )
}}

它不起作用:(而且我不确定我在做什么错-对axios不太熟悉。

我在Google Chrome控制台中收到此错误

enter image description here

2 个答案:

答案 0 :(得分:0)

我认为该错误是由于您调用的json变量不存在于更新的代码中。

答案 1 :(得分:0)

您需要通过 response.data 访问数据。使用fetch()时,可以将响应转换为response.json(),然后使用thenable来点击json,但是使用axios时,您可以无需任何转换即可立即获得响应。

export const login = (email, password) => {
    return (dispatch) => {
        dispatch({
           type: 'CLEAR_MESSAGES'
        })

axios.post("/login", {email, password}).then((response) => {
    dispatch({
       type: 'LOGIN_SUCCESS',
       token: response.data.token,
       user: response.data.user
    });
    cookie.save('token', json.token, { expires: moment().add(1, 'hour').toDate() });
    browserHistory.push('/account');
})
.catch(() => dispatch({
    type: 'LOGIN_FAILURE',
    messages: Array.isArray(json) ? json : [json]
    })
)