axios 无法使用Pinia调用API内的存储

enxuqcxy  于 2022-11-05  发布在  iOS
关注(0)|答案(1)|浏览(1030)

我正在使用Vue 3.2 <script setup>,如果我尝试访问API服务内的Pinia存储,它会抛出以下错误;
未捕获的引用错误:在api.js?:9:1(匿名)@ api.js?9:9初始化之前无法访问“store”

源代码/服务/api.js:

import axios from 'axios';
import store from '../stores/index';

// eslint-disable-next-line no-undef

const api = axios.create({ baseURL: import.meta.env.VITE_APP_API_URL });

if (store) {
  const { token } = store;

  if (token) {
    api.defaults.headers.Authorization = `Bearer ${token}`;
  }
}
console.log(api);

export default api;

源代码/存储/索引.ts:

import { defineStore } from 'pinia'
import Project from '../models/Project';
import { grantAuthSshd, revokeAuth, parseJwt } from '../services/auth';

const initialUser = JSON.parse(sessionStorage.getItem('Orcamento:token') || '{}');

const useProject = defineStore('project-store', {

  state: () => ({
    loading: false as boolean,
  }),

  actions: {
    loadingDataTable(status: ((status: boolean) => void) & boolean) {
      this.loadingDataTable = status;
    },
  }
});

我尝试使用Pinia的拦截器,但错误仍然存在:

import axios from 'axios';
import useProject from '../stores/index';

const api = axios.create({ baseURL: import.meta.env.VITE_APP_API_URL });

// use interceptors
api.interceptors.request.use(
  (config) => {
    const { token } = store;
    if ({token}) {
      api.config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
  );

const store = useProject();

export default api;
bvuwiixz

bvuwiixz1#

问题是services/api.jsstores/index.ts模块之间存在间接循环依赖关系,以至于无法正确计算它们。
useProject()返回一个singleton,存储区用函数 Package 的原因之一是防止它被过早访问。Pinia存储区应该在Pinia初始化后才被访问,否则这将需要以一个特定的顺序来评估依赖于它的模块,而这并不容易实现。
在这种情况下,useProject应该就地使用,而不是在模块求值时使用:

api.interceptors.request.use(
  (config) => {
    const store = useProject();
    const { token } = store;
    ...

由于ES模块的工作方式,这允许解决循环依赖。
避免循环依赖的一种方法是将此代码从services/api.js移动到stores/index.ts不依赖的另一个模块,例如入口点。

相关问题