我正在使用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;
1条答案
按热度按时间bvuwiixz1#
问题是
services/api.js
和stores/index.ts
模块之间存在间接循环依赖关系,以至于无法正确计算它们。useProject()
返回一个singleton,存储区用函数 Package 的原因之一是防止它被过早访问。Pinia存储区应该在Pinia初始化后才被访问,否则这将需要以一个特定的顺序来评估依赖于它的模块,而这并不容易实现。在这种情况下,
useProject
应该就地使用,而不是在模块求值时使用:由于ES模块的工作方式,这允许解决循环依赖。
避免循环依赖的一种方法是将此代码从
services/api.js
移动到stores/index.ts
不依赖的另一个模块,例如入口点。