• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Vuex storage nie jest dostępny w Axios HTTP interceptorze

Object Storage Arubacloud
+1 głos
448 wizyt
pytanie zadane 6 kwietnia 2018 w JavaScript przez BT101 Stary wyjadacz (12,540 p.)

Piszę front przy użyciu vue2js, vuex oraz biblioteki Axios.

Jeżeli backend wyśle error 401 to próbuję wywołać (w dokumentacji nazywa się to commitem) mutację logout, która usuwa token z mojego vuex storage oraz przestawia zmienną boolean na false. Ogólnie wywołuję również inną mutacje z innego miejsca w moim SPA i tam wszystko działa jak należy ale gdy staram się wywołać mutację z interceptora to dostaję taki błąd:

TypeError: Cannot read property '$store' of undefined

at eval (httpInterceptor.js?bdcd:22)

Kod mojego interceptora

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

export default function execute() {

    axios.interceptors.request.use((config) => {
         /* not related to issue */
    });

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

}

Jest on zaimportowany do pliku main.js (jest to entry point mojego bundlera) i tam też wywołany. 

Mój vuex storage to:

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) => { 
           /* not related */
        },
        logout: (state) => {
            state.logged = false;
            state.token = '';
        }
    },
    plugins: [
        createPersistedState()
    ]
});

Mój vuex jest również zaimportowany do main.js i poprawnie przypisany do Vue instance ( chodzi mi o to new Vue({...}); ).

Próbowałem zmienić scope zamieniając te arrow funkcje na zwykłe ale to nic nie zmieniło, dalej miałem identyczny błąd.

Skąd ten błąd? Czemu nie mogę " komitnąć " mojej mutacji?

2 odpowiedzi

0 głosów
odpowiedź 7 kwietnia 2018 przez niezalogowany
wybrane 7 kwietnia 2018 przez BT101
 
Najlepsza
import { store } from '../store/store';

Zaimportowałeś store jako zmienną store. Użyj zmiennej store.

komentarz 7 kwietnia 2018 przez BT101 Stary wyjadacz (12,540 p.)
Tsaaa. zmyliły mnie przykłady z dokumentacji, bo tam było pokazane jak używać tego w metodach komponentu
0 głosów
odpowiedź 7 kwietnia 2018 przez ProgramistaStepek Nałogowiec (27,020 p.)

Błąd pojawia się, ponieważ masz problem z this. Aby móc użyć konstrukcji 

this.$store

this musi być ustawiony na instancję Vue, podczas gdy w twoim interceptorze tym this jest po prostu funkcja execute()

komentarz 7 kwietnia 2018 przez BT101 Stary wyjadacz (12,540 p.)
edycja 7 kwietnia 2018 przez BT101

Spróbowałem zmienić scope na ten w którym importuje vue i axios:

import axios from 'axios';
import { store } from '../store/store';
const that = this;

export default function execute() {

    axios.interceptors.request.use((config) => {
        const token = store.state.token;
        if(token) {
            config.headers.Authorization = `Bearer ${token}`;
            return config;
        } else {
            return config;
        }
    }, (err) => {
        return Promise.reject(err);
    });

    axios.interceptors.response.use((response) => {
        return response;
    }, (err) => {
        console.log(err.response.status);
        if(err.response.status === 401) {
            that.$store.commit('logout');
        }
        console.log('err'); // this doesnt even console log
        return Promise.reject(err);
    });

}

i błąd jest nadal ten sam.

komentarz 7 kwietnia 2018 przez ProgramistaStepek Nałogowiec (27,020 p.)
A przeczytałeś o co mi chodzi? W tej chwili this to obiekt globalny window, który nie ma właściwości $store.

Podobne pytania

0 głosów
0 odpowiedzi 67 wizyt
0 głosów
1 odpowiedź 114 wizyt
pytanie zadane 21 lutego 2022 w JavaScript przez Pico Obywatel (1,330 p.)
0 głosów
0 odpowiedzi 228 wizyt
pytanie zadane 22 września 2021 w JavaScript przez Piotr Kułakowski Początkujący (390 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...