を使用して2つのJS私はこのようなvuexストアの成功のログインコールの後にトークンを格納します。Axiosインターセプター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
にアクセスできます。
今、残りのAPIバックエンドを呼び出すすべてのリクエストにトークンを追加します。
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);
});
私は基本的なAxios httpインターセプタを作成しました。
- は、私はすべてのコンポーネント間で
this.$store.state.logged
またはthis.$store.state.token
を使用して利用可能であることを知っているが、私はそれを単一のJavaScriptファイルにも同じように使うことができますか? - インターセプタのjavascriptファイルはどこで実行する必要がありますか?それは私のアプリのメインフォルダにある独立したファイルですが、私は前に働いていたangularJSのどこでも呼び出すわけではありません。私は
$httpProvider.interceptors.push('authInterceptorService');
を設定に追加しなければなりませんでしたが、vueアーキテクチャで同じことをする方法はわかりません。だからどこでインターセプターを注入すべきですか?
EDIT
は、私は私のmain.jsファイルに
import interceptor from './helpers/httpInterceptor.js';
interceptor();
を追加GMaioloヒントに続いて、私はこれに私のインターセプタをリファクタリング:
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);
});
}
結果この変更の中には、既に存在するすべてのバックエンドcトークンを必要としないalls(GET)は動作を停止しましたが、どの要求にトークンを追加すべきかを明確にしなかったので論理的です。どこにでも追加しようとしています。なぜ既に存在していた要求がすべて機能しなくなったのか
私は、ブラウザのコンソールで、バックエンドのPOST呼び出しをしようとすると、私はまだ、このエラーを取得:私は私のインターセプタファイルにストアをインポートしますが
TypeError: Cannot read property '$store' of undefined
を。何か案は?必要に応じてさらに情報を提供することができます。
トークンcostantを宣言した行で、このエラーが発生します。 'TypeError:プロパティ '$ store'がeval(httpInterceptor.js?c694:5)で未定義の'を読み込めません。私はGetterを使ってそれを集めるのではなく、 'this。$ store.state.token; 'でこれを達成しようとしました。私はそこにvuexをインポートする必要がありますか?または、このゲッターをこの場合に使用する必要がありますか? – BT101
'this。$ store.state.token'は私のインターセプタでは利用できません。 – BT101
はい! 'interceptors.js'の中からストアをインポートする必要があります。 – GMaiolo