无法在 Axios 拦截器中访问 Vuex 存储突变

Posted

技术标签:

【中文标题】无法在 Axios 拦截器中访问 Vuex 存储突变【英文标题】:Can't access Vuex storage mutation inside Axios interceptor 【发布时间】:2018-09-12 22:05:59 【问题描述】:

编辑:这个问题非常混乱,所以我基本上用相同的代码示例和相同的场景重写它。


当服务器发送 401 错误作为响应时,我试图将 .commit 从拦截器发送到我的 vuex 存储:

import axios from 'axios';
import  store  from '../store/store';

export default function execute() 
    axios.interceptors.request.use(function(config) 
        const token = store.state.token;
        if(token) 
            config.headers.Authorization = `Bearer $token`;
            //console.log(config);
            return config;
         else 
            return config;
        
    , function(err) 
        return Promise.reject(err);
    );
    axios.interceptors.response.use((response) => 
        return response;
    , (err) => 
        console.log(err.response.status);
        if(err.response.status === 401) 
            this.$store.commit('logout');
        
        console.log('err'); // this doesnt even console log
        return Promise.reject(err);
    );

但它会抛出错误

TypeError: 无法读取未定义的属性“$store”

在 eval (httpInterceptor.js?bdcd:22)

我不知道为什么我认为我正确地导入了它。

我使用箭头函数,我也尝试不使用箭头函数,但它会导致与上述相同的错误。

我在 main.js 中通过导入并调用 (import interceptor from './helpers/httpInterceptor.js'; interceptor();) 来执行我的拦截器

我的vuex存储文件是:

import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate'

Vue.use(Vuex);

export const store = new Vuex.Store(
    state: 
        logged: false,
        token: ''
    ,
    mutations: 
        login: (state, response) => 
            if(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 = '';
        
    ,
    plugins: [
        createPersistedState()
    ]
);

我将它分配给 Vue 实例

new Vue(
    el: '#app',
    router,
    store,
    template: '<app/>',
    components:  app 
);

为什么我不能在这个拦截器中使用我的突变,是什么导致了问题以及如何解决它?

【问题讨论】:

【参考方案1】:

好的,我修好了。所以我做错的是我遵循了类似this.$store.... 的文档示例,当您在组件方法中使用它时很好。当我像变量一样导入它时

import store from '../store/store';

我应该改变

this.$store.commit('logout');

store.commit('logout');

现在它工作正常。

【讨论】:

请注意,如果您以模块格式使用商店,则必须导入商店本身(设置 Vuex 的地方)而不是商店模块文件。

以上是关于无法在 Axios 拦截器中访问 Vuex 存储突变的主要内容,如果未能解决你的问题,请参考以下文章

Axios 拦截器 - 如何从 vuex 商店返回响应

将 vuex 存储导入 axios 和 app.js 文件

存储在 vuex axios 响应中无法正常工作

Vue.js:vuex 操作中未捕获的承诺

Axios 拦截器未从 vuex 商店获取当前用户身份验证令牌

使用 VueX 访问数据