gpt4 book ai didi

javascript - Vuex store/navigation guard 第一次不工作

转载 作者:行者123 更新时间:2023-11-29 18:39:24 24 4
gpt4 key购买 nike

我在用户的仪表板上有一个导航守卫,它需要用户存在才能继续。

export default new Router({
routes: [
{
path: '/',
name: 'home',
component: Home
},
{
path: '/dashboard',
name: 'dashboard',
component: Dashboard,
beforeEnter: (to, from, next) => {
const user = JSON.parse(store.state.authenticatedUser)
if(user) {
console.log("Route accepted.")
next()
} else {
console.log("Route rejected.")
next('/')
}
}
}
]
})

在我的登录表单上,我发送到 obtainToken,它返回 token 和关联的用户。

<template>
<v-container>
<h1 class="display-2">Login</h1>
<v-form
ref="form"
v-model="valid"
lazy-validation
>
<v-col cols="12" md="12">
<v-row align="center">
<v-text-field
v-model="email"
:rules=emailRules
label="Email"
required
dense
></v-text-field>
</v-row>
<v-row align="center">
<v-text-field
v-model="password"
label="Password"
required
dense
type="password"
></v-text-field>
</v-row>
</v-col>
<v-btn
@click="login"
>Login</v-btn>
</v-form>
</v-container>
</template>

<script>
export default {
data: () => ({
valid: true,
password: '',
email: '',
emailRules: [
v => !!v || 'Email is required.',
v => /.+@.+\..+/.test(v) || 'You have entered an invalid email.',
],
}),
methods: {
login() {
this.$store.dispatch('obtainToken', { email: this.email, password: this.password })
this.$router.push('dashboard')
}
}
}
</script>
  actions: {
logout() {
this.commit('revokeUser')
this.commit('revokeToken')
},
obtainToken(random, payload) {
const data = {
email: payload.email,
password: payload.password
}

api.post(this.state.endpoints.obtainToken, data)
.then((response => {
this.commit('updateSessionUser', response.data.user)
this.commit('updateToken', response.data.token)
}))
.catch((e) => {
console.log(e)
})
},

当点击提交时,获取到用户,但是路由被拒绝,因为此时用户不存在。我必须再次单击 submit,这将允许用户访问 dashboard 路由。

enter image description here

所以我可以从输出中收集到的是 $router.push 正在发生,因为 obtainToken 正在发生,因此它们会竞争。第二次登录时已经有用户在场,因此继续。我在这里做错了什么?


我也尝试过让 router.push() 也被称为 promise 的解决方案。

login() {
this.$store.dispatch('obtainToken', { email: this.email, password: this.password })
.then(() =>
this.$router.push('dashboard')
)
}

最佳答案

问题似乎出在 login 方法中。

login() {
this.$store.dispatch('obtainToken', { email: this.email, password: this.password })
this.$router.push('dashboard')
}

将同时运行两个调用。尝试在获取 token 调用结果之前导航用户。

login() {
this.$store.dispatch('obtainToken', { email: this.email, password: this.password })
.then(() =>
this.$router.push('dashboard')
)
}

一旦 token 存在,就可以在导航到仪表板时从状态中获取它。

关于javascript - Vuex store/navigation guard 第一次不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58360698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com