已安装:
[email protected]
@pinia/[email protected]
[email protected]
nuxt.config.ts的相关部分:
modules: [
'@pinia/nuxt',
],
plugins: [
{ src: '~/plugins/router.ts' }
],
imports: {
dirs: ['stores'],
presets: [
{
from: 'pinia',
imports: ['storeToRefs']
}
]
}
~/plugins/router.ts:(通过自动导入导入)
export default defineNuxtPlugin((nuxtApp) => {
useRouter().beforeEach(() => {
const store = useAuthStore();
console.log(store.isAuthenticated);
});
});
好吧,这对我来说毫无意义。我真的是在兜圈子。我为此遵循的任何文档都没有任何意义或与我的设置一起使用。
据我了解,我在路由器内部调用
useAuthStore()
beforeEach(<closure>)
意味着我应该有权访问 pinia 商店。然而事实并非如此。
上述代码会导致以下浏览器控制台输出,并且应用程序拒绝加载:
未捕获错误:[nuxt] 需要访问 Nuxt 的可组合项 实例在插件、Nuxt 钩子、Nuxt 中间件之外调用, 或Vue设置函数。这可能不是 Nuxt 错误。了解更多 在 'https://nuxt.com/docs/guide/concepts/auto-imports#using-vue-and-nuxt-composables'。
所以这是真正混乱的部分。如果我将插件代码更改为:
export default defineNuxtPlugin((nuxtApp) => {
useRouter().beforeEach(() => {
console.log(nuxtApp.vueApp.$nuxt.$pinia);
});
});
我在控制台中收到“pinia”对象日志(应用程序功能正常 - useRouter() 调用没有问题!):
据我所知,在代码的这一点上,Pinia 不仅被创建,商店也被初始化,并且它们被填充了数据。那么为什么我无法访问我的商店?
我在这里快要疯了,所以任何帮助将不胜感激。我只是无法理解问题是什么以及我需要做什么来解决它。我已经花了几个小时了。
误报(其中一个想爬进洞里,一会儿不出来)。
非常尴尬地承认问题实际上非常简单,并且伴随
A composable that requires access to the Nuxt instance was called outside of a plugin
错误消息的堆栈跟踪实际上指向了有问题的行(在发表这篇文章之前我看了几个小时,并没有意识到我在看什么).
事情是这样的:
useAuthStore()
时(有或没有 $pinia
实例),我的商店 ~/stores/useAuthStore.ts
正在初始化。useFetch()
包装器可组合 ~/composables/useApi.ts
正在初始化。useApi.ts
文件的最顶部,我正在运行 const config = useRuntimeConfig();
-- 不在方法内,努力使其可供文件中的所有方法使用 -- 而这一行最终导致了问题是因为它是在插件/中间件/设置/等场景之外运行,而不是我的 useAuthStore()
调用。我最终是如何弄清楚这一点的,当我抓住吸管时,我开始真正“向墙上扔垃圾”,最后我做的一件事就是尝试开设另一家商店
useToastStore()
我已经设置了在全球范围内处理吐司方式并且效果完美!这让我意识到authStore
“内部”有一些东西导致了问题。一旦我意识到这一点,只需几分钟就能找出实际问题。
所以问题解决了......感谢所有试图帮助我的人。我真的很感谢你的努力!