Vuex 操作未将本地存储令牌添加到 Axios 调用后

Posted

技术标签:

【中文标题】Vuex 操作未将本地存储令牌添加到 Axios 调用后【英文标题】:Vuex action is not adding localstorage token to Axios post call 【发布时间】:2021-07-02 14:20:58 【问题描述】:

我使用烧瓶作为我的后端服务器。 vuex 操作未将令牌从本地存储状态设置为 Axios API 调用。请帮我解决我所缺少的。目前我被困在这里,这与我的previous question 有关,我无法得到答案,所以再次发布.. 下面是我的 vuex 商店代码:

Vue.use(Vuex);
export default new Vuex.Store(
  state: 
    // accessToken: JSON.parse(localStorage.getItem('access_token')) || null,
    // refreshToken: JSON.parse(localStorage.getItem('refresh_token')) || null,
    accessToken: localStorage.getItem('access_token') || null,
    refreshToken: localStorage.getItem('refresh_token') || null,
    APIData: '',
  ,
actions: 
refreshToken(context) 
      return new Promise((resolve, reject) => 
        console.log(context.state.refreshToken);
        getAPI.post('/refresh', 
          // refresh_token: context.state.refreshToken,
          headers:  Authorization: `Bearer $context.state.refreshToken` ,
        )
          .then((response) => 
            console.log('New access token granted');
            context.commit('updateAccessToken', response.data.access_token);
            console.log(context.state.accessToken);
            resolve(response.data.access_token);
          )
          .catch((error) => 
            console.log('\'error in refresh:\'', error);
            reject(error);
          );
      );
    ,


【问题讨论】:

我不是 Vuex 专家,但我用过几次。尝试将您的状态值初始化为常量作为占位符,并创建突变(如果同步)或操作(如果异步)以调用 localStorage.getItem() @Tim 你能举个例子吗? 刚刚看到您对 11 小时前的示例的请求(这里是早上)。如果您在接下来的 8 小时内解决了问题,请通过评论告诉我。如果没有,我今晚会尝试看看。 您好,尚未解决。 js不太好。以期待为例。完整的代码可以在我之前的帖子中找到,我在我的问题中添加了它。 【参考方案1】:

这是我使用简化的 Vuex 商店和 Vue 组件构建的示例,用于演示功能。

/store/index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store(
  state: 
    accessToken: '',
    localStorage: window.localStorage
  ,
  getters: 
    getTokenFromLocalStorage: state => 
      return state.localStorage.getItem('accessToken');
    
  ,
  mutations: 
    storeTokenInLocalStorage(state, newToken) 
      state.accessToken = newToken;
      state.localStorage.setItem('accessToken', newToken);
    
  
)

VuexLocalStorage.vue

<template>
  <div class="vuex-local-storage">
    <div class="row">
      <div class="col-md-6">
        <button class="btn btn-secondary" @click="getAccessToken">Get Access Token</button>
        <h5> accessToken </h5>
      </div>
    </div>
  </div>
</template>

<script>
  export default 
    data() 
      return 
        accessToken: ''
      
    ,
    methods: 
      getAccessToken() 
        this.accessToken = this.$store.getters.getTokenFromLocalStorage;
      
    ,
    created() 
      // Store initial access token
      this.$store.commit('storeTokenInLocalStorage', 'access-token');
    
  
</script>

【讨论】:

以上是关于Vuex 操作未将本地存储令牌添加到 Axios 调用后的主要内容,如果未能解决你的问题,请参考以下文章

如何在axios中配置授权承载令牌?

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

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

如何在没有本地存储的情况下将 JWT 令牌存储在 VueX 中

Vue Axios 本地存储的令牌未定义

使用Vue+axios+Vuex实现登录后前端数据本地化存储实战