nuxt實(shí)現(xiàn)封裝axios并且獲取token
nuxt封裝axios并且獲取token
axios 多環(huán)節(jié)變量配置不同地址
npm安裝方式
npm i --D cross-env
"scripts": { "dev": "cross-env process.env.__ENV=測(cè)試地址 nuxt", "build": "cross-env process.env.__ENV=打包地址 nuxt build", "start": "nuxt start", "export": "nuxt export", "serve": "nuxt serve" },
nuxt.config.js配置
env: { __ENV: process.env.__ENV },
axios全局使用的時(shí)候
axios.defaults.baseURL?=?process.env.__ENV
nuxt 服務(wù)端進(jìn)行請(qǐng)求時(shí)帶上token
期望結(jié)果:在服務(wù)端、客戶端請(qǐng)求時(shí)候帶上token
實(shí)現(xiàn)方式:把請(qǐng)求的cookie放到header里
如果沒有 安裝 cookie-universal-nuxt 需要安裝一下插件
//修改 nuxt.config.js //添加模塊 modules: [ 'cookie-universal-nuxt', "@nuxtjs/axios", ] //添加插件引用 plugins:[ '@/plugins/axios', ]
//添加插件文件 plugins/axios.js let isClient = process.env.VUE_ENV === 'client' //區(qū)分端 export default ({ redirect, $axios, app }) => { $axios.onRequest(config => { return new Promise((resolve, reject) => { //match api let token = app.$cookies.get('token') //add token if (token) config.headers.Authorization = token; //其他的請(qǐng)求前業(yè)務(wù)邏輯 比如:api map resolve(config); }) }); $axios.onResponse(res => { return new Promise((resolve, reject) => { //返回?cái)?shù)據(jù)邏輯處理 比如:error_code錯(cuò)誤處理 resolve(res.data); }) }); $axios.onError(config => { console.log('Making request to ' + config.url) }) };
nuxt——nuxt.axios的使用
bug:localStorage不存在
在SSR中,created生命周期在服務(wù)端執(zhí)行,node環(huán)境中沒有l(wèi)ocalStorage所以會(huì)報(bào)錯(cuò),
將需要使用localStorage的代碼放到瀏覽器使用的生命周期(mounted)中。
配置文件配置axios文件不在服務(wù)端渲染 { src: ‘@/plugins/axios’, ssr: false }
axios封裝 plugins/axios.js
import { Message, Notification } from 'element-ui' import Cookie from 'js-cookie' export default function (app) { const axios = app.$axios // 基本配置 axios.defaults.timeout = 10000 axios.defaults.headers.post['Content-Type'] = 'application/json' axios.defaults.headers.patch['Content-Type'] = 'application/json' axios.defaults.headers.put['Content-Type'] = 'application/json' // 請(qǐng)求回調(diào)(若token從localStorage獲取,接口只能在mounted之后調(diào)用) axios.onRequest((config) => { const token = Cookie.get('token') config.headers.Authorization = token }) // 返回回調(diào) axios.onResponse((response) => { console.log(8888,response.data) if (response.data.code === 200) { return Promise.resolve(response.data) } else if (response.data.code === 401) { Message.error('請(qǐng)登錄后再操作'); } else { Message.error(response.data.msg); return Promise.reject(response.data) } }) // 錯(cuò)誤回調(diào) axios.onError((error) => { switch (error.response.status) { case 401: location.href = '/login' break } }) } // nuxt.config.js plugins: [ '@/plugins/element-ui', '@/plugins/axios', //{ src: '@/plugins/axios', ssr: false } 關(guān)閉服務(wù)端渲染 ], //找到modules模塊,把proxy添加到里面 modules: [ '@nuxtjs/axios', '@nuxtjs/proxy' ], axios: { proxy: true // Can be also an object with default options }, proxy: { '/api': { changeOrigin: true, target: 'http://127.0.0.1:8082', // 允許跨域的服務(wù)器地址 pathRewrite: { '^/api': '' } } }
調(diào)用接口
async asyncData ({ params, $axios }) { const { data } = await $axios.get(`/articles/index?pageIndex=1`) return { data, page: 1 } } this.$axios.post('url', {}) this.$axios.get('url', { params:{} }) async asyncData ({ params, $axios }) { const [articles, category] = await Promise.all([ $axios.$get(`/articles/category/${params.id}`), $axios.$get(`/categories/${params.id}`) ]) }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue添加請(qǐng)求攔截器及vue-resource 攔截器使用
這篇文章主要介紹了Vue添加請(qǐng)求攔截器及vue-resource 攔截器使用,需要的朋友可以參考下2017-11-11vue使用video.js實(shí)現(xiàn)播放m3u8格式的視頻
這篇文章主要為大家詳細(xì)介紹了vue如何使用video.js實(shí)現(xiàn)播放m3u8格式的視頻,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12Vue 菜單欄點(diǎn)擊切換單個(gè)class(高亮)的方法
今天小編就為大家分享一篇Vue 菜單欄點(diǎn)擊切換單個(gè)class(高亮)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08基于Ant-design-vue的Modal彈窗 封裝 命令式與Hooks用法
這篇文章主要給大家介紹了基于Ant-design-vue的Modal彈窗封裝命令式與Hooks用法,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的同學(xué)可以借鑒閱讀2023-06-06