javascript - 无法访问 Axios 拦截器内的 Vuex 存储突变

标签 javascript http axios interceptor vuex

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


当服务器发送 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: Cannot read property '$store' of undefined

at eval (httpInterceptor.js?bdcd:22)

我不知道为什么我认为我导入它是正确的。

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

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

我的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 }
});

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

最佳答案

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

从 '../store/store' 导入 { store };

我应该改变

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

store.commit('logout');

现在一切正常。

关于javascript - 无法访问 Axios 拦截器内的 Vuex 存储突变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49632461/

相关文章:

javascript - Backbone.js 查看事件未触发

javascript - 链接到 JQuery CDN 会降低我的网站速度吗?

java - 向网站发送帖子请求

vue2JS 中的服务 - 创建钩子(Hook)时出错

reactjs - 如果react js axios中没有可用数据,如何显示 "no data available"消息?

javascript - 创建仅允许数字、小数和逗号的输入

javascript - 使用 javascript 和 canvas 标签禁用动画 gif?

http - 缓存控制 header 和条件请求

php - 一次 HTTP 请求中的链接单击和按钮单击

vue.js - 即使响应为 200(成功)也会调用 Axios Catch