Nuxt Vuex商店Cookie问题

时间:2018-06-13 23:07:23

标签: vue.js vuejs2 vuex serverside-rendering nuxt.js

一天的美好时光!

在我的项目开发几周后,我决定从普通的Vue迁移到Nuxt。

主要是因为我需要SSR,虽然我知道Google可以执行页面上显示的JS,因此可以为他们的搜索机器人生成适当的内容。

另一个原因是项目开发的一般工作流程。我喜欢自动实例化路线,商店等的想法。

但是,当应用程序在mode: universal而不是mode: spa中运行时,我会遇到一种非常奇怪的行为。而且我不想切换到mode: spa从那时起我失去了我首先迁移的SSR。

我'在商店中有一个帐户模块 - account.js,负责处理与帐户管理相关的任何操作,例如登录/注销,获取经过身份验证的用户的配置文件,存储从登录请求获得的令牌以及用于处理2FA TOTP程序的逻辑。

在我的传统应用程序中,我只需使用以下代码就可以从Cookie中获取令牌

import Cookies from 'js-cookie';

export const state = {
   user: null,
   token: Cookies.get('token')
}

通过执行以下突变,在成功验证后保存令牌:

[types.ACCOUNT_SAVE_TOKEN] (state, { token, remember }) {
    state.token = token;
    Cookies.set('token', token, {
      expires: 365,
      httpOnly: true
    });
}

但是在迁移到 Nuxt.js 之后,每次登录时,状态中的令牌值都会被填充,但是没有设置cookie,并且在导航到项目内的其他页面之后(它是pwa,所以没有重新加载等)令牌被重置为null。

如果应用程序从mode: spa切换到mode: universal并且一切正常,那么这个问题就消失了。

我已经在github上阅读了很多问题,并且在试图解决相同问题的网站上进行了大量的爬行,尽管这些建议都没有对我有用。

我甚至安装了来自NPM的cookie-universal-nuxt软件包,该软件包声称与SSR合作,但每次我尝试访问该州的this.$cookies.get('token')时,或者在其他任何地方(例如突变),我只是在null上使用该方法(获取/设置/删除)时遇到错误。

有没有人知道或不知道如何克服这个问题,至少在没有返回mode: spa的情况下是否可行?

P.S。在npm run build|generate中运行mode: spa会产生与正常vue相同的文件(没有内容,只有读取目标元素之前的结构)。

1 个答案:

答案 0 :(得分:0)

好的,在大约12个小时后试图绕过这个问题,我决定采用“肮脏”的方式创建中间件,在我看来,这样做可以对每个请求进行大量处理。

import CookieParser from 'cookieparser';

export default async function ({ store, req }) {
  if (!store.getters['account/check']) {
    if (!store.state.account.token) {
      if (process.server) {
        let requestCookies = CookieParser.parse(req.headers.cookie);
        if (requestCookies.hasOwnProperty('token')) {
          store.dispatch('account/saveToken', {
            token: requestCookies.token,
            remember: true
          });
        }
      }
    }
    if (store.state.account.token) {
      if (!store.state.account.user) {
         try {
           await store.dispatch('account/fetchUser');
         } catch (error) { }
      }
    }
  }
  return Promise.resolve();
}