在中间件中访问 LocalStorage - NuxtJs
Access LocalStorage in Middleware - 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()
仪表板布局中添加相同的检查,但我不能 return window 未设置 mounted()
为时已晚,它可以仅在页面完全组装后检查。
那么我该如何实现呢?
注意:我不打算在这个项目中使用任何 Vuex。
您可以将其用于 Nuxt 中的本地存储(以及许多其他内容)。它将在客户端和服务器上工作。没有文档,但 README 应该足够了。
在用于登录操作的 vuex 存储上,我使用令牌设置了提交
window.$cookies.set('token', payload, {
path: '/',
})
并在中间件中访问它
middleware/auth.js
export default (context) => {
if (!context.app.$cookies.get('token')) {
return context.redirect('/login')
}
}
对于不满意将信息存储在 cookie 中的任何人,这是我的解决方案:
我在这方面遇到了很多问题,我对设置 cookie 不满意。
如果你是 运行ning Nuxt 并且没有告诉它在 spa 模式下 运行 它会在通用模式下 运行 。 Nuxt 将通用模式定义为:
Isomorphic application (server-side rendering + client-side navigation)
结果是 localStorage 未在服务器端定义,因此会引发错误。
给我的好处是从中间件文件和 Vuex 输出到终端的控制台日志记录,而不是浏览器中开发人员工具中的控制台。
我的解决方案是在位于根目录的 nuxt.config.js 中将模式更改为 spa。
请注意,您仍然可以在页面文件和组件中访问 localStorage,运行ning 通用模式,因为它们不在服务器端。
中间件文件在通用模式下是 运行 服务器端,因此更改为 spa 模式会使它们成为 运行 客户端,从而允许它们访问 localStorage。
有关 Nuxt 模式的更多信息,请阅读以下内容:
好吧,我从 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()
仪表板布局中添加相同的检查,但我不能 return window 未设置 mounted()
为时已晚,它可以仅在页面完全组装后检查。
那么我该如何实现呢? 注意:我不打算在这个项目中使用任何 Vuex。
您可以将其用于 Nuxt 中的本地存储(以及许多其他内容)。它将在客户端和服务器上工作。没有文档,但 README 应该足够了。
在用于登录操作的 vuex 存储上,我使用令牌设置了提交
window.$cookies.set('token', payload, {
path: '/',
})
并在中间件中访问它 middleware/auth.js
export default (context) => {
if (!context.app.$cookies.get('token')) {
return context.redirect('/login')
}
}
对于不满意将信息存储在 cookie 中的任何人,这是我的解决方案:
我在这方面遇到了很多问题,我对设置 cookie 不满意。 如果你是 运行ning Nuxt 并且没有告诉它在 spa 模式下 运行 它会在通用模式下 运行 。 Nuxt 将通用模式定义为:
Isomorphic application (server-side rendering + client-side navigation)
结果是 localStorage 未在服务器端定义,因此会引发错误。
给我的好处是从中间件文件和 Vuex 输出到终端的控制台日志记录,而不是浏览器中开发人员工具中的控制台。
我的解决方案是在位于根目录的 nuxt.config.js 中将模式更改为 spa。
请注意,您仍然可以在页面文件和组件中访问 localStorage,运行ning 通用模式,因为它们不在服务器端。
中间件文件在通用模式下是 运行 服务器端,因此更改为 spa 模式会使它们成为 运行 客户端,从而允许它们访问 localStorage。
有关 Nuxt 模式的更多信息,请阅读以下内容: