Reputation: 2754
I'm currently using Nuxt and I created a central ApiClient in my app using axios.
services/apiClient.js
import axios from "axios";
import store from '../store/index';
const token = () => {
return store().getters.getToken;
};
const axiosClient = axios.create({
baseURL: "this-is-a-url",
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
'X-Api-Key': token() // this returns error: Object(...) is not a function from Vuex
}
});
axiosClient.interceptors.request.use(function (config) {
console.log(token()); // this prints the token type string
return config;
}, function (error) {
return Promise.reject(error);
});
When I use the token()
in axios headers, I'm getting the error:
Uncaught TypeError: Object(...)
but when I call it from axios interceptor I'm getting the correct token type String.
store/index.js
import Vuex from 'vuex';
import * as sessions from './modules/sessions';
const store = () => {
return new Vuex.Store({
getters: {
isAuthenticated() {
return sessions.state.token != null;
}
},
modules: {
sessions
}
});
};
export default store;
store/modules/sessions.js
import axios from 'axios';
export const state = {
token: localStorage.getItem('token') || null,
};
export const mutations = {
SET_TOKEN(state, token) {
state.token = token;
}
};
export const actions = {
login({ commit }) {
return new Promise((resolve, reject) => {
axios.get(`/retrieveKey`)
.then(response => {
localStorage.setItem('token', response.data.value);
commit('SET_TOKEN', response.data.value);
resolve(response.data);
})
.catch(error => {
reject(error);
});
});
},
logout({ commit }, context) {
localStorage.removeItem('token');
window.location.reload();
}
};
export const getters = {
getToken(state) {
return state.token;
}
};
Upvotes: 1
Views: 1899
Reputation: 4125
May be you can put console.log to debug the value of store(), store().getters and store().getters.getToken inside the token function like below and compare the difference values between axiosClient call and interceptors call.
const token = () => {
const store = store();
const getters = store.getters;
const getToken = getter.getToken;
console.log(store, getters, getToken)
return getToken;
};
Error message of "this returns error: Object(...) is not a function from Vuex" is because of token is equal to null in axiosClient.
It is because of Initial state of the localStorage.getItem('token') is null/undefined and hence its value becomes null before the login done.
export const state = {
token: localStorage.getItem('token') || null,
};
Refer to Getters of Vuex guide, the getters will be exposed on the store.getters
object, and you access values as properties.
May be you can get the token value via store.getters.getToken
instead of store().getters.getToken
?
Upvotes: 1