постоянно обновлять токен при действии axios

#javascript #vue.js #axios

#javascript #vue.js #axios

Вопрос:

Я хочу использовать экспресс-REST API, для которого требуется действительный веб-токен json для некоторых маршрутов. Из-за того, что мне приходится передавать токен из localstorage каждый раз, когда я хотел создать «файл конфигурации Axios».

Мой файл http.js содержит следующий код

 import Vue from "vue";
import axios from "axios";

const devInstance = createInstance("http://localhost:3000");

devInstance.interceptors.request.use(config => {
    console.log(config);
    return config;
}, err => {
    console.log(err);
    return Promise.reject(err);
});

devInstance.interceptors.response.use(res => {
    console.log(res);
    return res;
}, err => {
    console.log(err);
    return Promise.reject(err);
});

const productionInstance = createInstance("http://www.myApi.com");

function createInstance(baseURL){
    return axios.create({
        baseURL,
        headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${localStorage.token}`
        }
    });
}

Vue.prototype.$http = devInstance; // Check debug/build mode
  

в моем main.js Я импортирую этот экземпляр один раз

 import http from "./http.js";
  

и с этого момента я могу использовать this.$http для получения глобального экземпляра axios без его импорта.

При использовании API localStorage.token возвращается значение undefined, поскольку оно не задано при создании экземпляра.

Как я могу обновлять этот Authorization атрибут, не передавая токен каждый раз вручную?

Ответ №1:

Я думаю, вам следует написать перехватчик запросов, который добавляет Authorization заголовок ко всем запросам.

 devInstance.interceptors.request.use((config) => {
    config.headers.Authorization = `Bearer ${localStorage.token}`;
    return config;
}, (error) => Promise.reject(error));
  

Таким образом, вы всегда будете получать сохраненный в данный момент токен.

Ответ №2:

Вы должны создать таймер и асинхронное обновление для этого поля авторизации. Либо отдельный компонент, который обрабатывает это, либо таймер и асинхронный метод в этом компоненте (хотя не уверен, что вы можете сделать это с помощью Vue).

Надеюсь, это поможет. Приветствия