更改实例标头时的Axios其他实例也更改

时间:2019-02-07 07:51:43

标签: javascript axios

有这样的axios实例

// @flow
import axios, { type Axios } from 'axios';
import { HOST } from 'constants/host';

// Set config defaults when creating the instance
export const AppApi = axios.create({
  baseURL: `${HOST.APP_API.URL}${HOST.APP_API.API_PREFIX}`,
});

export const MenuApi = axios.create({
  baseURL: `${HOST.MENU_API.URL}${HOST.MENU_API.API_PREFIX}`,
});

export const setAuthToken = (authToken: string, api: Axios) => {
  api.defaults.headers.common['Authorization'] = authToken;
};

在那里您会注意到方便的setAuthToken函数。

在我获得身份验证令牌并将其设置为实例后使用。

但是每当我更改任何实例标头时,所有其他实例也会更改。

甚至默认的axios对象。 如果我愿意

axios.defaults.headers.common['Authorization'] = 'afds';

所有实例都会更改。

这是一个错误,还是我在这里错过了什么?

这是如何在文档中完成的。

https://github.com/axios/axios

请参阅“自定义实例默认设置”

2 个答案:

答案 0 :(得分:0)

这是axios的已知错误。

解决方法是像这样添加空的对象层次结构。

export const AppApi = axios.create({
  baseURL: `${HOST.APP_API.URL}${HOST.APP_API.API_PREFIX}`,
  headers: { common: {} },
});

export const MenuApi = axios.create({
  baseURL: `${HOST.MENU_API.URL}${HOST.MENU_API.API_PREFIX}`,
  headers: { common: {} },
});

更多信息在这里

https://github.com/axios/axios/issues/1664

答案 1 :(得分:-1)

您只需要更改该实例的默认值,而不是axios。

export const MenuApi = axios.create({
  baseURL: `${HOST.MENU_API.URL}${HOST.MENU_API.API_PREFIX}`,
});

例如,您可以将令牌设置为

MenuApi.defaults.headers.common['Authorization'] = 'afds';

不是

axios.defaults.headers.common['Authorization'] = 'afds';

否则,它将在所有实例中更改。