在不更改路由的情况下重新评估Nuxt.js中间件



我想知道是否有可能;重新评估";中间件条件而不实际改变当前路由。

中间件的目的是防止未登录的用户访问";仪表板";。我的问题是,用户可以在不必更改路由的情况下登录或注销,但在尝试更改页面之前,他们不会被重定向。

我有一个VueX操作,当用户的身份验证状态发生变化时会触发,但这(从我所看到的(无法访问重定向或路由变量。

// /mixins/auth.js
const reevaluateAuthStatus = (store, redirect, route) => {
console.log(route)
const redirectPolicy = route.meta.map((meta) => {
if (meta.auth && typeof meta.auth.redirectPolicy !== 'undefined') { return meta.auth.redirectPolicy[0] }
return []
})
const user = store.getters['auth/getUser']
if (redirectPolicy.includes('LOGGEDOUT')) {
if (user) {
return redirect('/dashboard')
}
} else if (redirectPolicy.includes('LOGGEDIN')) {
if (!user) {
return redirect('/login')
}
}
}
module.exports = {
reevaluateAuthStatus
}
// /middleware/auth.js
import { reevaluateAuthStatus } from '../mixins/auth'
export default function ({ store, redirect, route }) {
reevaluateAuthStatus(store, redirect, route)
}

感谢在这方面的任何帮助:(

您不能重新评估中间件AFAIK,因为它主要是

当导航到进一步的路由时,客户端将调用中间件[…]

两种干净的方法仍然可以实现此IMO:

  • 使用一些websocket,无论是带有socket.io还是类似于Apollo订阅的东西,都可以让你的UI考虑到新的变化
  • 将中间件逻辑导出为某种调用,您可以通过再次调用$fetch钩子或Nuxt中任何其他与数据相关的获取钩子来再次触发该调用

一些更丑陋的解决方案可能是:

  • 制作内部setInterval,每隔5秒左右检查实际状态是否仍然有效
  • 按照Vue路由器文档中的解释,移动到您实际使用this.$router.go(0)的页面

不过,在大多数情况下,如果用户注销,我认为这可能不是一个大问题,因为一旦他尝试了一些东西,他就会被重定向
就好像用户已经登录一样,我甚至不确定如果他没有在你的SPA上做一些主动的事情,会在哪种情况下发生这种情况。

我不知道它是否相关,但我用这种方式解决了一个类似的问题:

  • 我有一个全局中间件来检查身份验证状态。它是一个接收Context作为参数的函数
  • 我有一个插件,它将自己注入上下文(例如$middleware(。中间件功能在此导入
  • 在这个插件中,我定义了一个方法来调用这个传递上下文的中间件(因为插件也有context作为参数(:ctx.$middleware.triggerMiddleware = () => middleware(ctx);
  • 现在,中间件在每次路由更改时都会按预期触发,但我也可以在任何地方调用this.$middleware.triggerMiddleware()

最新更新