首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Axios:在POST之前组合来自拦截器和组件的数据请求

Axios:在POST之前组合来自拦截器和组件的数据请求
EN

Stack Overflow用户
提问于 2020-01-17 11:04:51
回答 2查看 966关注 0票数 0

我有这个函数动作

代码语言:javascript
运行
复制
export function unlinkAccount(id) {
  return function(dispatch) {
    const data = {
      id: id
    };
    return userApi
      .post('/user/account/unlink', data)
      .then(res => console.log('SUCCESS: unlinkAccount -> ', res))
      .catch(err => console.log('ERROR: unlinkAccount -> ', err));
  };
}

但是我也截取了下面的请求

代码语言:javascript
运行
复制
userApi.interceptors.request.use(
  async config => {
    const jwtToken = await refreshToken();
    if (jwtToken) {
      config.data = { accessToken: jwtToken };
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

这将使用来自拦截器的数据而不是unlinkAccount函数向userApi发出POST。当我需要按照以下格式传递数据时,有没有办法将这两种数据组合在一起,或者作为'props‘传递给unlinkAccount函数?

代码语言:javascript
运行
复制
const data = {
   id: id,
   accessToken: jwtToken
}

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-17 11:30:14

是的,只要找出解决方案,我只需将拦截器请求中的config.data更改为

代码语言:javascript
运行
复制
if (jwtToken) {
      config.data = { accessToken: jwtToken, ...config.data };
    }

因此,它将从组件中获取数据,并在创建POST之前合并截取数据。

票数 0
EN

Stack Overflow用户

发布于 2020-01-17 11:13:49

以下是我在过去所做的:

我认为,每次调用api时传递jwtToken都不是一个好方法。如果你使用下面的方法,你只需要

代码语言:javascript
运行
复制
const data = {
      id: id
    };
    return userApi
      .post('/user/account/unlink', data)

而且,你不需要每次都调用refreshToken。

代码语言:javascript
运行
复制
import axios from 'axios';

import { store } from '../index';
import { updateAuth } from '../redux/actions/auth';
import { apiURL } from '../config';

axios.defaults.baseURL = apiURL;

// Add a request interceptor
axios.interceptors.request.use(
  (config) => {
    const { tokenType, accessToken, loggedIn } = store.getState().auth;
    const token = `${tokenType} ${accessToken}`;
    if (loggedIn) {
      config.headers['Authorization'] = token;
    }
    config.headers['Content-Type'] = 'application/json';
    return config;
  },
  (error) => {
    Promise.reject(error);
  }
);

//Add a response interceptor

axios.interceptors.response.use(
  (response) => {
    return response;
  },
  function(error) {
    const originalRequest = error.config;

    if (
      error.response.status === 401 &&
      (originalRequest.url === `${apiURL}auth/login` ||
        originalRequest.url === `${apiURL}auth/refresh-token`)
    ) {
      // router.history.push('/auth/login');
      return Promise.reject(error);
    }

    if (error.response.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      const { refreshToken } = store.getState().auth;
      const { email } = store.getState().user;

      return axios
        .post('/auth/refresh-token', {
          email,
          refreshToken
        })
        .then((response) => {
          const { data: res } = response;
          if (res.code === 200) {
            store.dispatch(updateAuth({ ...res.token }));
            const { tokenType, accessToken } = res.token;
            axios.defaults.headers.common[
              'Authorization'
            ] = `${tokenType} ${accessToken}`;
            return axios(originalRequest);
          }
        });
    }
    return Promise.reject(error);
  }
);

export default axios;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59780635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档