首先,我在webpack上使用vuejs 2.0,vue路由(在历史模式下-SPA站点),vuex在webpack开发服务器上运行,并加载热模块.

我为组件绘制了大约10条路由.该网站运行得很好,但现在我添加了一些基于令牌的身份验证.我在用路由.在此之前,请执行令牌判断.如果 token 有效,应该让他们通过.如果令牌无效,它应该将它们重定向到/login页.问题是它第一次执行判断并对其进行限制.但第二次try 允许我进入页面并显示内容.每秒钟的请求似乎都能正确处理路由并重定向到/login.出于测试目的,我的checkToken()函数总是返回false.

代码:

// Configure Router
const router = new Router({
    routes, //routes are configured elsewhere, they work fine so not needed
    mode: 'history'
})

router.beforeEach((to, from, next) => {
    if(to.path != '/login') {
        if(checkToken()) { 
            logger('There is a token, resume. (' + to.path + ')');
            next();
        } else {
            logger('There is no token, redirect to login. (' + to.path + ')');
            next('login');
            // next('/login');
            // router.push('login');
        }
    } else {
        logger('You\'re on the login page');
    }
    next();
});


function checkToken() {
    return false;
}

转到主页("/"),它会按预期重定向到/login.在我的控制台中,我有以下两个条目:

[14:36:30.399]:没有令牌,重定向到登录.(/)

看起来不错.它试图加载"/"并看到没有令牌,然后重定向到/login,判断显示我们在登录页面上并停止.

现在我将点击我的Projects链接,这将带我到/project.控制台输出:

[14:40:21.322]:没有令牌,重定向到登录.(/项目)

很好,但实际上显示的是projects页,而不是login页.

现在我将点击我的Sites链接,它将带我到/site.控制台输出:

[14:41:50.790]:没有令牌,重定向到登录.(/站点)[

看起来不错,浏览器显示的是site页.这正是我想看到的.

现在我点击我的Requests链接到/request.控制台输出:

[14:44:13.114]:没有令牌,重定向到登录.(/请求)

但再一次,它不是重定向.我看到的是我的request页,而我应该看到我的login页.

这一次,我将再次点击我的Projects链接(/project),它错误地显示了project页而不是login页.控制台输出:

[14:47:12.799]:没有令牌,重定向到登录.(/项目)[

这一次,它将我的页面重定向到了/login页,这是它应该做的.

实际上,我点击的每一个链接都会被适当重定向,无论我点击的顺序或链接是什么.第一个重定向,第二个不重定向,第三个重定向,第四个重定向,第五个重定向,等等...

我试过next('/login')、next('login')和router.按一下("登录"),结果都一样.它知道什么时候应该重定向,但重定向只在每隔一段时间起作用.

如果我做了一个完整的请求(页面刷新,输入地址,然后按enter键),它总是会按照计划重定向到/login,但我正试图用SPA来实现这一点.我有什么遗漏吗?

推荐答案

固定的我的疏忽.

这就是路由的代码:

router.beforeEach((to, from, next) => {
    if(to.path != '/login') {
        if(checkToken()) { 
            logger('There is a token, resume. (' + to.path + ')');
            next();
        } else {
            logger('There is no token, redirect to login. (' + to.path + ')');
            next('login');
        }
    } else {
        logger('You\'re on the login page');
        next(); // This is where it should have been
    }
    // next(); - This is in the wrong place
});

愚蠢的问题简单的回答,我的next()在错误的地方,所以它总是在最后处理它.不过,我仍然很好奇,为什么它会正确地重定向.

Vue.js相关问答推荐

VueJS不会呈现一个名为None的组件""

我可以将Created()中内置的内容传递给Provide属性吗?

Vutify-v-工具提示-不使用键盘轻击按钮显示

如何使用 vueJS 上的 ref( ) 函数创建二维数组定义?

如何从 Vuex 状态使用 Vue Router?

使用 v-slot:body 时 Vuetify v-data-table 没有响应

如何只查看数组中的一个对象?

如何在 vue.js 2 的其他组件中调用方法?

为什么不先移动鼠标就无法滚动视差?

在 SASS 中使用 Vuetify 类

如何从我的 Vuetify 数据表中正确更新 Vuex 状态

如何在 VueJS 中访问 [__ob__: Observer] 的元素?

我可以避免使用 Vue.js 组件的重复样式吗?

Proxy代理在 Vue 3 的控制台中是什么意思?

如何在 Vuex 中获取 Vue 路由参数?

错误:Node Sass 尚不支持您当前的环境:Linux 64-bit with Unsupported runtime (88)

在找不到图像源时设置替代图像

Leaflet+Vue+Vuetify / Leaflet map 隐藏 vuetify 弹出对话框

模块构建失败:错误:没有给出解析器和文件路径,无法在 nuxtjs 中推断出解析器

Vue.js webpack:如何获取目录中的文件列表?