Nuxt使用cookies踩坑之设置axios的header

情景介绍:公司中有一个类似单点登录的项目,主系统中有登录后username和token,存放在浏览器的cookies中,现在改造的子系统需要拿到这两个cookie值,再通过axios的设置header头部信息去向后端请求数据,由于使用了asyncData和nuxtServerInit方法,所以在服务端一开始就需要这两个数据,但是又拿不到客户端的cookie,查了很多资料

解决方案1  如下:这里使用Nuxt插件的方法封装Axios

步骤一:在plugins目录下新建axios-plugin.js

import axios from 'axios'

//开启浏览器端cookie传递

axios.defaults.withCredentials=true

const EDU_SERVER_API='http://127.0.0.1/api/v2';

let options = {};

options.baseURL = EDU_SERVER_API

let ax = { options:options, get: (req,url) => { options.headers = { "Cookie": req.headers.cookie+";" }

url=options.baseURL+url;

return axios.get(url,options); }}

// 为了在 asyncData 方法中使用

export default ({ app }, inject) => {

// Set the function directly on the context.app object

app.$global = {

ax:ax

}

};


步骤二 在Nuxt.config.js中新增plugins

plugins: [

    '@/plugins/global',

    {

      src:'@/plugins/element-ui',

      ssr: true,

    },

    '@/plugins/axios-plugin'

  ],

然后在AsyncData中使用

export default {

    async asyncData(params) {

      return params.app.$global.ax.get(params.req, '/user/').then(res => {

        return {user: res.data.user};

      })

    }

}

解决方案2

介绍:使用中间件

1. 通过 express 取得 cookies

在 server.js 上引入 cookies 解析中间件

constcookieParser =require('cookie-parser')

并且在路由前面 use

app.use(cookieParser())

2. 将 cookies 注入 render 的上下文中

app.get('*', (req, res) => {// 其他代码省略constcontext = {url: req.url,cookies: req.cookies    }constrenderStream = renderer.renderToStream(context)// 其他代码省略})

3. 将 cookies 注入 vuex 的 store 中

在server-entry.js文件中, 将 cookies 注入到 store 中

exportdefaultcontext => {// 其他代码省略if(context.cookies) {        store.state.cookies = context.cookies    }// 其他代码省略}

这样就可以在组件中取到 cookies 了.

4. 封装请求

这里以 axios 为例, 将 cookies 加载封装函数的参数中:

注意: 这里的封装, 建议将浏览器用的和 node 用的分开

importaxiosfrom'axios'constparseCookie =cookies=>{letcookie =''Object.keys(cookies).forEach(item=>{        cookie+= item +'='+ cookies[item] +'; '})returncookie}exportdefault{    get(url, params, cookies = {}) {constcookie = parseCookie(cookies)returnaxios({method:'get',            url,            params,headers: {'X-Requested-With':'XMLHttpRequest',                cookie            }        })    }}

5. 发起带 cookies 参数的请求

在组件中 dispatch vuex 的 actions:

constfetchInitialData =async(store, config = {page:1}) => {awaitstore.dispatch('frontend/article/getList', config)}exportdefault{name:'frontend-index',prefetch: fetchInitialData,// 其他代码省略}

在 vuex 的 actions 中, 从 store 里读取 cookies, 作为参数传给请求接口的函数

async['getList']({commit,rootState: {cookies}}, config) {const{data: { data, code} } =awaitapi.get('/api/article/list', config, cookies)// 其他代码省略}

6. 几个注意点

1, cookies的内容中不允许带中文, 不知道从什么版本开始, http-server 的 header 里有中文就直接报错

2,import store from '../store'这种方式下的 store 是不会带 cookies 的

解决方案3(我使用的方案)

middleware下创建axiosMiddle.js

import axios from 'axios'

import md5 from 'js-md5'

import cookies from 'js-cookie'

export default function({req,res}) {

  if (req.headers !== undefined) {

    let cookieArr = req.headers.cookie;

    //获取cookie然后拆成键值对

    const getUserName = getCookie('name', cookieArr)

    const getToken = getCookie('tiken', cookieArr)

    //设置axios的全局变量.

    axios.defaults.timeout = 60000 // 响应时间

    // @requestParams

    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

    axios.defaults.headers.username = getUserName

    axios.defaults.headers.token = getToken

    axios.defaults.withCredentials = true

  }

}

//解析浏览器中的cookies

function getCookie (name, strCookie) {

  console.log('strCookie',strCookie)

  var arrCookie = strCookie.split(';')

  for (var i = 0; i < arrCookie.length; i++) {

    var arr = arrCookie[i].split('=')

    if (arr[0].trim() === name) {

      return arr[1]

    }

  }

  return {}

}

在nuxt.config,js中设置下使用中间件即可

router: {

    middleware:'axiosMiddle'

  },

至此,结束

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351