特定路由的 NuxtJS 路由中间件

NuxtJS route middleware for specific routes

我想保护某些路由仅在用户登录时可用。我想要执行此操作的方法是调用 API 来验证当前令牌。

令牌可以在本地存储或商店(VueX)中。

我在中间件文件夹中创建了一个名为 auth.js 的中间件,并将其添加到 nuxt.config.js 文件中。

export default function ({ store, redirect }) {
  if (!process.client && !store.getters['user/getUserToken']) {
    return redirect('/login')
  }
}

我现在遇到的问题是 process.client 被忽略,此代码在服务器 (SSR) 上被触发,因此导致错误“localStorage is not defined”。

三天来我一直在努力让它工作,所以希望有人能向我解释如何让它工作。

我想要实现的是我能够在加载页面之前发出 API 请求以验证用户他的令牌。令牌可以存储在 VueX 存储或本地存储中。所以我需要同时访问两者。

希望有人能帮助我解决这个问题。

仅供参考,我使用的是获取方法,而不是 Axios 或类似的方法。对于这个项目,使用 Axios 不是一个选项,因为我们需要重构很多。

如果您不使用 nuxt/auth but a homemade solution, you can still get inspired by my answer here:

我的 global.js 中间件是 auth 中间件的补充(来自 nuxt/auth),但逻辑也可以用相同的方式完成。

一些要点:

  • 中间件总是 运行 在您的页面呈现之前,因此您没有义务在服务器上执行此操作,验证仍会在 之前 内容可见
  • 更喜欢使用 cookie 而不是 localStorage,更安全并且在服务器和客户端上都可用
  • 在我看来,使用 axios 或 fetch 都不是什么大问题,因为它们基本上做完全相同的事情(总体而言)
  • axios 可以重命名为 fetch,特别是如果你有一个通用的 可配置文件,有点老套,但需要较少的维护 IMO