javascript - 如何使中间件在页面加载之前完成对服务器的异步请求并提交到 Vuex 存储?
问题描述
我的中间件使用firebase.auth().onAuthStateChanged
用户对象并将其存储在 Vuex 存储中以防万一。代码工作正常,但页面在 Vuex 存储中的用户对象设置之前加载。我的另一个中间件通过检查用户对象是否存在来保护某些页面。因此,如果我加载http://localhost:3000/protected
,我将被拒绝访问,但如果我首先加载另一个页面并继续http://localhost:3000/protected
通过 a<nuxt-link>
我可以访问该页面。
如何让 nuxt 在加载页面之前等待中间件 setUser?
export default async function (context, callback) {
auth.onAuthStateChanged(user => {
if (user) {
context.store.commit("setUser", user)
callback()
} else {
callback()
}
})
}
更新:插件方法产生相同的结果
解决方案
在这里您可以阅读 Vue 中的身份验证示例:https ://scotch.io/tutorials/vue-authentication-and-route-handling-using-vue-router
基本上,您可以在让用户打开受保护的组件之前检查身份验证。实现这一点的最简单方法是使用路由器防护。在您的路由器定义中:
{
path: '/proctected',
beforeEnter(to, from, next) {
if (isAuthenticated()) {
next();
} else {
next('/page-to-show-for-unauthenticated-users');
}
}
}
这个守卫将防止输入 /proctected
url。在这里您可以检查工作中的 codepen:https ://codepen.io/anon/pen/JwxoMe
有关路由器保护的更多信息:https ://router.vuejs.org/guide/advanced/navigation-guards.html#per-route-guard
推荐阅读
- c++ - C++ 数组大于 0 打印代码
- c - 在for循环中运行scanf时出现逻辑错误,我该如何解决?
- xamarin - Xamarin.Forms:适用于 Android 的自定义上下文操作
- python - Python - 如何使用“with as”块结束套接字
- java - 在 pom.xml 文件中设置 Maven 本地存储库位置?
- google-sheets - 使用 IF() 函数的多个选项
- tensorflow - TensorFlow Cifar10 对 logits 和 label 的成本查找错误(logits 和 label 必须相同大小)
- python - NLTK 替换停用词
- c# - 带有 C# 后端的 IOS 设备的 WebApi 通知
- c++ - 继承中的 C++ 复制构造函数