命名空间模块auth的重复命名空间auth /

时间:2019-12-14 19:55:33

标签: vue.js vuex nuxt.js nuxt

在安装nuxtjs模块后,我一直收到此错误。我尝试了书中的所有技巧来修复它,但似乎没有任何效果。添加了更多信息。

[vuex] duplicate namespace auth/ for the namespaced module auth

我对此感到沮丧。

auth: {
    plugins: [{ src: '~/plugins/axios', ssr: true }, '~/plugins/auth.js'],
    vuex: {
      namespace: 'auth'
    },
    strategies: {
      local: {
        endpoints: {
          login: {
            url: "login",
            method: "post",
            propertyName: "meta.token"
          },
          user: {
            url: "me",
            method: "get",
            propertyName: false
          },
          logout: {
            url: "logout",
            method: "post"
          },
          redirect: {
            login: "login",
            logout: "/",
            home: "/",
            callback: "/"
          },
          watchLoggedIn: true,
          rewriteRedirects: true
        }
      }
    }
  },

插件

plugins: [
    { src: "~/plugins/Maps.js", ssr: false },
    { src: "~/plugins/Typed.js", ssr: false },
    { src: "~/plugins/Animate.js", ssr: false },
    { src: "~/plugins/Counter.js", ssr: false },
    { src: "~plugins/Vimeo.js", ssr: false },
    "~plugins/mixins/user.js",
    "~plugins/mixins/validation.js",
  ],

auth.js << ----存储

export const getters = {
    authenticated(state) {
        return state.loggedIn;
    },
    user(state) {
        return state.user;
    }
};

export const state = () => ({
    busy: false,
    loggedIn: false,
    strategy: "local",
    user: false
});

以下是我目前拥有的代码。如果您需要查看其他文件,请随时告诉我。

https://www.youtube.com/watch?v=FojAfwueTLc

3 个答案:

答案 0 :(得分:1)

更新后,今天也遇到了同样的问题。解决:

将auth.js逻辑移至index.js并删除auth.js。

index.js:

export const getters = {
    authenticated(state) {
      return state.auth.loggedIn
    },

    user(state) {
      return state.auth.user
    }
  }

如果您使用的是user.js mixin,请对其进行如下修改:

import Vue from 'vue'
import {mapGetters} from 'vuex'

    const User = {
        install(Vue, options) {
            Vue.mixin({
                computed: {
                    ...mapGetters({
                        user: 'user',
                        authenticated: 'authenticated'
                    })
                }
            })
        }
    };

    Vue.use(User);

答案 1 :(得分:1)

默认情况下,Nuxt使用 auth名称空间保留身份验证信息。如果您还在商店目录中创建文件auth.js,则将与默认配置冲突。

"Panos"提供的解决方案完全可以。但是,如果您真的有兴趣创建一个新模块来像您一样维护身份验证信息,则可以在商店目录中创建文件Auth.js而不是auth.js。不会与默认名称空间冲突。

然后,您可以从nuxt身份验证模块返回身份验证信息,如下所示。在这里,我使用rootState

捕获身份验证模块的状态
export const getters = {
authenticated(state, getters, rootState) {
 return rootState.auth.loggedIn;
},

user(state, getters, rootState) {
 return rootState.auth.user;
}
};

此外,如果您使用的是user.js mixin,请对其进行如下修改:

import Vue from "vue";
import { mapGetters } from "vuex";

const User = {
  install(Vue, options) {
  Vue.mixin({
  computed: {
    ...mapGetters("Auth", {
      user: "user",
      authenticated: "authenticated"
    })
  }
});
}
};
Vue.use(User);

答案 2 :(得分:0)

您的商店文件夹中可能有一个名为“ auth.js”的文件,并且没有在nuxt.config.js文件中显式设置vuex.namespace选项。

从文档中:

  

store目录中的每个.js文件都转换为命名空间模块(索引是根模块)。

因此,“ auth”会自动成为名称空间。

问题是“ auth”也是用于保持状态的默认Vuex存储名称空间,因为如果未明确设置nuxt.config.js文件中的“ vuex.namespace”选项,默认情况下它是“ auth”。那就是重复的地方。

要解决此问题,请将store / auth.js更改为store / authentication.js之类的内容,或者将nuxt.config.js文件中的vuex.namespace选项更改为除“ auth”之外的其他内容,否则用作默认值。