【发布时间】:2018-06-05 09:54:36
【问题描述】:
我在成功登录调用后将令牌存储在 vuex 商店中,如下所示:
axios.post('/api/auth/doLogin.php', params, axiosConfig)
.then(res => {
console.log(res.data); // token
this.$store.commit('login', res.data);
})
axiosConfig 是我只设置 baseURL export default { baseURL: 'http://localhost/obiezaca/v2' } 的文件,params 只是发送到后端的数据。
我的 vuex 文件看起来是:
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export const store = new Vuex.Store({
state: {
logged: false,
token: ''
},
mutations: {
login: (state, response) => {
state.logged = true;
state.token = response;
console.log('state updated');
console.log('state.logged flag is: '+state.logged);
console.log('state.token: '+state.token);
},
logout: (state) => {
state.logged = false;
state.token = '';
}
}
});
它工作正常,我可以根据v-if="this.$store.state.logged" 为登录用户重新渲染我的 SPA 中的一些内容。我可以从整个应用程序中的任何组件访问this.$store.state.logged。
现在我想将我的令牌添加到调用我的 rest API 后端的每个请求中。我创建了基本的 axios http 拦截器,如下所示:
import axios from 'axios';
axios.interceptors.request.use(function(config) {
const token = this.$store.state.token;
if(token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
}, function(err) {
return Promise.reject(err);
});
现在我有 2 个问题/疑问。
- 我知道可以在每个组件中使用
this.$store.state.logged或this.$store.state.token,但我可以在单个 javascript 文件中以同样的方式使用它吗? - 我应该在哪里执行/启动我的拦截器 javascript 文件?它是位于我的应用程序主文件夹中的独立文件,但我没有在任何地方调用它,在我之前工作的 angularJS 中,我必须在配置中添加
$httpProvider.interceptors.push('authInterceptorService');但我不知道如何在 vue 架构中做同样的事情.那么我应该在哪里注入我的拦截器呢?
编辑
我遵循了我添加的 GMaiolo 提示
import interceptor from './helpers/httpInterceptor.js';
interceptor();
到我的 main.js 文件,我将我的拦截器重构为:
import axios from 'axios';
import store from '../store/store';
export default function execute() {
axios.interceptors.request.use(function(config) {
const token = this.$store.state.token;
if(token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
}, function(err) {
return Promise.reject(err);
});
}
此更改的结果是每个不需要令牌工作的现有后端调用 (GET) 都停止工作,但这是合乎逻辑的,因为我没有澄清它应该向哪个请求添加令牌,所以它正在尝试添加它无处不在,在我的拦截器中仍然有问题,这就是为什么每个已经存在的请求都停止工作的原因。
当我尝试在浏览器控制台中进行后端 POST 调用时,我仍然收到此错误:
TypeError: 无法读取未定义的属性“$store”
虽然我将 store 导入到我的拦截器文件中。有任何想法吗?如果需要,我可以提供更多信息。
我另外添加了这个主、存储和拦截器树结构的屏幕截图,这样你就可以看到我正在从正确的路径导入:
【问题讨论】:
标签: vue.js vuejs2 axios interceptor vuex