pinia 踩坑 报错:ReferenceError: Cannot access 'useUserStore' before initialization

场景

当我们在前后端分离的项目中,前端就需要封装一个request.js文件来统一封装请求,在请求拦截器和响应拦截器中做一些事情。我用到的是axios。

报错原因

在请求拦截器中,使用pinia存储的token,

ts 复制代码
import axios from 'axios'
import useUserStore from '@/store/user'

const userStore = useUserStore()

// 创建axios实例
const request = axios.create({
  baseURL: 'http://192.168.11.111:4041/api',
  timeout: 3000,
})

// axios请求拦截器
request.interceptors.request.use(
  async (config) => {
    // 配置请求头
    const authorization = userStore.accessToken
    // 验证token
    if (authorization) {
      config.headers.authorization = 'Bearer ' + authorization
    }
    return config
  },
  (e) => Promise.reject(e),
)

// axios响应式拦截器
request.interceptors.response.use(
  (res) => res.data,
  (e) => {
    return Promise.reject(e)
  },
)
export default request

解决方案

Pinia store 依靠 pinia 实例在所有调用中共享同一个 store 实例。大多数时候,只需调用你定义的 useStore() 函数,完全开箱即用。例如,在 setup() 中,你不需要再做任何事情。但在组件之外,情况就有点不同了。 实际上,useStore() 给你的 app 自动注入了 pinia 实例。这意味着,如果 pinia 实例不能自动注入,你必须手动提供给 useStore() 函数。

此时仅需要将 const userStore = useUserStore() 放入 请求拦截器中即可

ts 复制代码
// axios请求拦截器
request.interceptors.request.use(
  async (config) => {
    const userStore = useUserStore()

    // 配置请求头
    const authorization = userStore.accessToken
    // 验证token
    if (authorization) {
      config.headers.authorization = 'Bearer ' + authorization
    }
    return config
  },
  (e) => Promise.reject(e),
)

具体可参考pinia官方文档:pinia.vuejs.org/zh/core-con...

相关推荐
梨想橙汁17 分钟前
Webpack 快速上手:前端工程化、打包原理、从零搭建基础项目
前端·webpack·前端工程化
zhanghaha131421 分钟前
HTML系列教程:12_HTML 表格 <table> 零基础详解
前端·html
Betterme25 分钟前
Vue3 竞态请求防护组合式hooks:useLatestRequest 设计思路
前端
_zhourui_h_28 分钟前
一个 [ECS] 到底生成了多少代码?EasyECS 最核心的秘密都在这里
前端
梨想橙汁31 分钟前
Git 分支详解:创建切换、合并分支、冲突解决实战
前端·git
雪芽蓝域zzs32 分钟前
Vue3 defineProps` / `defineEmits` 是编译器宏,不需要手动 import 导入
前端·javascript·vue.js
whyweplay37 分钟前
Elpis:从Json Schema 到 页面
前端·javascript
做萤石二次开发的哈哈1 小时前
海康班班通交互一体机技能接入实战:ISAPI透传+OTAP双协议封装,Web/App/小程序教学管理应用一站生成
前端·物联网·小程序·交互·萤石开放平台·蓝海aiot一站式工作台·aiot开发
计算机魔术师1 小时前
Anthropic一次性锁死十年算力,5170亿美元买什么
前端
IT_陈寒1 小时前
Redis的订阅丢失消息?你可能忘了这个配置
前端·人工智能·后端