无法从 Nuxt3 插件代码访问 Pinia 商店(错误提示“在插件之外”,但实际上并非如此)

问题描述 投票:0回答:1

已安装:

[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 不仅被创建,商店也被初始化,并且它们被填充了数据。那么为什么我无法访问我的商店?

我在这里快要疯了,所以任何帮助将不胜感激。我只是无法理解问题是什么以及我需要做什么来解决它。我已经花了几个小时了。

vue.js nuxt.js vue-router pinia
1个回答
0
投票

误报(其中一个想爬进洞里,一会儿不出来)。

非常尴尬地承认问题实际上非常简单,并且伴随

A composable that requires access to the Nuxt instance was called outside of a plugin
错误消息的堆栈跟踪实际上指向了有问题的行(在发表这篇文章之前我看了几个小时,并没有意识到我在看什么).

事情是这样的:

  1. 插件在应用程序初始化期间加载并注册我的插件中的“导入”依赖项。
  2. 当以任何身份使用
    useAuthStore()
    时(有或没有
    $pinia
    实例),我的商店
    ~/stores/useAuthStore.ts
    正在初始化。
  3. 我的身份验证存储有一种方法可以处理从后端刷新 CSRF 令牌,因此我的
    useFetch()
    包装器可组合
    ~/composables/useApi.ts
    正在初始化。
  4. 在我的
    useApi.ts
    文件的最顶部,我正在运行
    const config = useRuntimeConfig();
    -- 不在方法内,努力使其可供文件中的所有方法使用 -- 而这一行最终导致了问题是因为它是在插件/中间件/设置/等场景之外运行,而不是我的
    useAuthStore()
    调用。

我最终是如何弄清楚这一点的,当我抓住吸管时,我开始真正“向墙上扔垃圾”,最后我做的一件事就是尝试开设另一家商店

useToastStore()
我已经设置了在全球范围内处理吐司方式并且效果完美!这让我意识到
authStore
“内部”有一些东西导致了问题。一旦我意识到这一点,只需几分钟就能找出实际问题。

所以问题解决了......感谢所有试图帮助我的人。我真的很感谢你的努力!

© www.soinside.com 2019 - 2024. All rights reserved.