在中间件中访问 LocalStorage - NuxtJs

新手上路,请多包涵

好吧,我从 nuxt 开始,我有以下路线:

 /home

/dashboard

/login

我想保护 /dashboard,但仅限于使用 localStorage 中的令牌登录的用户。

我想到的最简单的方法是创建一个 /middleware/auth.js

 export default function () {
  if (!window.localStorage.getItem('token')) {
    window.location = '/login'
  }
}

并将其注册到 /dashboard/index.vue 组件中。

 <script>
export default {
  middleware: 'auth',
}
</script>

但是我无法在中间件内访问 localStorage ,因为 LocalStorage 是客户端。

我已经尝试在 created() 仪表板布局中添加相同的检查,但我无法返回 window not set mounted() 太晚了,它只能在页面完全组装后检查.

那么我该如何实现呢?注意:我不打算在这个项目中使用任何 Vuex。

原文由 Yung Silva 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

我使用 了 cookie-universal-nuxt

在用于登录操作的 vuex 存储上,我设置了一个带有令牌的提交

window.$cookies.set('token', payload, {
    path: '/',
})

并在中间件中访问它作为 middleware/auth.js

 export default (context) => {
    if (!context.app.$cookies.get('token')) {
        return context.redirect('/login')
    }
}

原文由 rrrm93 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于不满意将信息存储在 cookie 中的任何人,这是我的解决方案:

我在这方面遇到了很多问题,我对设置 cookie 不满意。如果您正在运行 Nuxt 并且没有告诉它以 spa 模式运行,它将以通用模式运行。 Nuxt 将通用模式定义为:

同构应用(服务端渲染+客户端导航)

结果是 localStorage 未在服务器端定义,因此会引发错误。

给我的好处是从中间件文件和 Vuex 输出到终端的控制台日志记录,而不是浏览器中开发人员工具中的控制台。

我的解决方案是在位于根目录的 nuxt.config.js 中将模式更改为 spa。

请注意,您仍然可以在页面文件和组件中访问运行通用模式的 localStorage,因为它们不在服务器端。

在通用模式下,中间件文件在服务器端运行,因此更改为 spa 模式会使它们在客户端运行,从而允许它们访问 localStorage。

有关 Nuxt 模式的更多信息,请阅读以下内容:

原文由 MR_BlueScr 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题