Использование NativeScript vue. Я поместил axios в свой собственный файл, где я могу добавить перехватчики и т. Д. (В этом случае для обработки токена обновления JWT). В моем магазине vuex (ccStore) я сохранил authToken и refreshToken. Я использую vuex persist.
import axios from 'axios'
// abridged ...
import ccStore from './store';
const DEV_BASE_URL = ccStore.getters.getBaseURL // local ip injected by webpack
const PROD_BASE_URL = ''
axios.defaults.baseURL = (TNS_ENV === 'production') ? PROD_BASE_URL : DEV_BASE_URL
axios.interceptors.request.use( function (config) {
let token = ''
if(config.url.includes('/auth/refresh')) { //use the refresh token for refresh endpoint
token = ccStore.getters.getRefreshToken;
} else { //otherwise use the access token
token = ccStore.getters.getAuthToken;
}
if (token) {
config.headers['Authorization'] = `Bearer ${token}`
}
return config
},
function (error) {
console.log(error)
return Promise.reject(error)
}
)
axios.interceptors.response.use(
function(response) {
console.log(response)
return response
},
function(error) {
const originalRequest = error.config
if(error.response && error.response.status === 401) {
if (originalRequest.url.includes('/auth/refresh')) { //the original request was to refresh so we must log out
return ccStore.dispatch('logout')
} else {
return ccStore.dispatch('refreshToken').then(response => { //try refreshing before logging out
return axios(originalRequest)
})
}
} else {
console.log(error)
return Promise.reject(error)
}
}
)
export default axios;
В своем файле app.js я импортирую этот измененный axios и назначаю его для
Vue.prototype.$http = axios;
Я сделал это так, чтобы один и тот же экземпляр axios с перехватчиками был доступен в каждом компоненте [Я вчера столкнулся с некоторыми проблемами при выполнении рефакторинга - циклические ссылки при включении моих модифицированных axios в смонтированный хук каждого компонента ... но придерживаться его глобально, кажется, работает]
Однако в моем файле app.js я также вызываю ccStore, чтобы я мог прикрепить его к своему экземпляру vue ... Я правильно это делаю? На один и тот же экземпляр ccStore ссылаются как app.js, так и axios?
Кроме того, чтобы еще больше согнуть ум, в моем хранилище vuex есть некоторые действия, для которых мне нужны axios ... поэтому мне также необходимо включить axios в мой файл хранилища vuex - однако axios уже включает мое хранилище vues ... .
так ...
app.js импортирует магазин и оси,
магазин импортных товаров,
Axios импорт магазин
Разве это не круглая тоже?