Nuxt.js中,vuex已经默认内核实现,可以使用普通模式和传统模式两种形式使用。

详见:https://www.nuxtjs.cn/guide/vuex-store/

在开发登录过程中遇到问题,vuex中存储的内容,在F5或者开新标签之后,数据就会消失。例如token之类的需要在客户端一直存在的数据,则需要重新加载到vuex中。

在路由中间件中无法获得window对象,因为Nuxt.js在ssr模式下,路由中间件是在服务器中进行工作的。所以我们尝试在每次服务启动时,使用cookie中保存的token值进行同步。

由于在Nuxt.js 3中,传统模式将要删除,在使用时也会进行提示,所以我们只是用普通模式进行开发。

在/store下创建文件token.js用来在vuex中存储token。

/store/token.js

export const state = () => ({
  data: null
})

export const mutations = {
  setToken (state, data) {
    state.data = data
  }
}

在login.vue中添加方法获取token并保存。

/pages/login.vue

import axios from 'axios';
const Cookie = process.client ? require('js-cookie') : undefined

export default {
    layout: 'login',
    data() {
        return {
            user: {
                userName: '',
                password: ''
            }
        };
    },
    methods: {
        login: async function() {
            
            let { data } = await axios.post(`http://127.0.0.1:3000/api/admin/login`, {
                'user': this.user
            })
            if( data.err ){
                alert(data.err)
            } else {
                this.$store.commit('token/setToken', data.token)
                Cookie.set('token', data.token)
                this.$router.push('/')
            }
        }
    }
}

此时,遇到一个问题,就是 nuxtServerInit 要如何使用。

根据官方文档介绍,写法如下:

actions: {
  nuxtServerInit ({ commit }, { req }) {
    if (req.session.user) {
      commit('user', req.session.user)
    }
  }
}

但这明显是一种传统形式的写法,这种写法在后续Nuxt.js版本中将会淘汰。

最终尝试发现,需要创建/store/index.js,在其中添加方法:

const cookieparser = process.server ? require('cookieparser') : undefined

export const actions = {
  nuxtServerInit ({ commit }, { req }) {
    let token = null
    if (req.headers.cookie) {
      const parsed = cookieparser.parse(req.headers.cookie)
      try {
        token = parsed.token
      } catch (err) {
        // 找不到有效的Cookie
      }
    }
    commit('token/setToken', token)
  }
}

才可以实现。

最后修改日期: 2019年12月11日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。