nuxt.js中使用axios以及二次封装

nuxtjs中使用axios 有两种方法:

1. 普通的方式:

1.1: npm或者yarn安装依赖包

npm install axios -S

普通使用方式网上查询,这里不再过多叙述。

2. 集成的方式:

  2.1:首先安装 @nuxtjs/axios

  npm install @nuxtjs/axios --save

   备注: 当使用脚手架create nuxt-app创建项目时,会提示是否集成axios。

  2.2:在项目根目录新建plugins/axios.js
/*** 该插件中包含了axios的各种配置,以及axios二次封装* 注释掉了全局引入loading的方法,页面采用局部loading,若有需求可以放开。* 1.token管理* 2.响应和请求的错误处理* 3.请求的loding控制** 使用时:$axios为nuxtjs集成的axios;$axios为"@nuxtjs/axios": "^5.13.6",* 作者:*/import _ from 'lodash'
import Vue from 'vue'
import { Loading, Message } from 'element-ui'
import { uuid } from '~/plugins/utils/uuid'let loadingInstance = nulllet needLoadingRequestCount = 0let securityCheckLock = false// 显示loading
function showLoading(target) {// 后面这个判断很重要,因为关闭时加了抖动,此时loading对象可能还存在,// 但needLoadingRequestCount已经变成0.避免这种情况下会重新创建个loadingif (needLoadingRequestCount === 0 && !loadingInstance) {loadingInstance = Loading.service({lock: true,text: 'Loading',spinner: 'el-icon-loading',background: 'rgba(0, 0, 0, 0.7)',})}needLoadingRequestCount++
}// 隐藏loading
function hideLoading() {needLoadingRequestCount--needLoadingRequestCount = Math.max(needLoadingRequestCount, 0) // 做个保护if (needLoadingRequestCount === 0) {// 关闭loadingtoHideLoading()}
}// 防抖:将 300ms 间隔内的关闭 loading 便合并为一次。防止连续请求时, loading闪烁的问题。
const toHideLoading = _.debounce(() => {if (loadingInstance) {loadingInstance.close()loadingInstance = null}
}, 300)// 如果想用redirect或者操作vuex的话需要对外暴露store和redirect
export default ({store,redirect,req,$axios,app,...args
}) => {// 请求拦截器,后续的token管理配置在这里$axios.onRequest((config) => {if (process.client) {// 浏览器执行的客户端代码if (config.headers.showLoading !== false) {// showLoading(config.headers.loadingTarget)}}if (process.server) {// node执行的服务端代码// node服务端做host穿透-重点在这里哟// config.headers.host = req.headers.hostif (!config.url.includes(process.env.baseUrl)) {config.url = process.env.baseUrl + config.url}}const token = Vue.prototype.$sdk.getUser().authUser if (token) {config.headers.authorization = 'Bearer ' + token}config.headers.traceId = uuid(32) // traceId,用于后端追踪日志return config},// 请求错误处理,暂时所有都提示(err) => {// 判断当前请求是否设置了不显示Loading(不显示自然无需隐藏)if (err.config.headers.showLoading !== false) {hideLoading()}if (process.client) {Message.closeAll()Message.error({showClose: true,message: err,})}return Promise.reject(err)})// 响应拦截器,处理header、config等数据,给应用层返回最简洁的数据data$axios.onResponse((res) => {const { data, headers } = res// 判断当前请求是否设置了不显示Loadingif (headers?.showLoading !== false) {hideLoading()}if (data?.code === -1) {// 常规错误处理if (process.client) {Message.closeAll()Message.error({showClose: true,message: data.message,})}} else if (data?.type === 'application/json') {// 常规错误处理if (process.client) {Message.closeAll()Message.error({showClose: true,message: '文件不存在',})}} else if (data?.code === -555) {// token过期处理if (process.client) {Message.closeAll()Message.error({showClose: true,message: '登录过期,请重新登录!',})sessionStorage.clear()}redirect({path: '/login',}) //  跳转到登录页,或使用vuex提交数据} if (data?.type === 'application/octet-stream') {return { data, headers }} else {return headers === undefined ? res : data}})// Error拦截器,出现错误的时候被调用$axios.onError((error) => {switch (error.response.status) {case 400:error.message = '请求错误'breakcase 401:error.message = '未授权,请登录'breakcase 403:error.message = '拒绝访问'breakcase 404:error.message = `请求地址出错: ${error.response.config.url}`breakcase 408:error.message = '请求超时'breakcase 500:error.message = '服务器内部错误'breakcase 501:error.message = '服务未实现'breakcase 502:error.message = '网关错误'breakcase 503:error.message = '服务不可用'breakcase 504:error.message = '网关超时'breakcase 505:error.message = 'HTTP版本不受支持'break}Message.error({showClose: true,message: error.message,})return Promise.resolve(false)})
}

2.3: nuxt.config.js中配置axios项

    modules: [// https://go.nuxtjs.dev/axios'@nuxtjs/axios',],axios: {proxy: true,prefix: '/api/',retry: { retries: 3 },common: {contentType: 'application/json',},},
    2.4:  store 中使用

const baseUrl = '/base-service'const state = () => ({})const mutations = {}const actions = {// 获取引擎列表async getList({ commit }, data) {return await this.$axios.post(`${baseUrl}/enginess/pageEnginesss`,data)},}export default {namespaced: true,state,mutations,actions,
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

备考蓝桥杯每日一题——C++分支结构“ABC”

今天在洛谷上遇到了一道很有意思的题 题目&#xff1a; 【题目描述】 三个整数分别为 A,B,C。这三个数字不会按照这样的顺序给你&#xff0c;但它们始终满足条件&#xff1a;A<B<C。为了看起来更加简洁明了&#xff0c;我们希望你可以按照给定的顺序重新排列它们。 【输入…

【C++】类与对象(三)—运算符重载|const成员函数|取地址及const取地址操作符重载

前言 运算符重载&#xff0c;自增自减运算符重载&#xff0c;const成员函数&#xff0c;取地址及const取地址操作符重载 文章目录 一、运算符重载自增和自减运算符重载 二、const 成员函数三、取地址及const取地址操作符重载&#xff08;了解即可&#xff09; 一、运算符重载 运…

网络开发的隐形壁垒:如何巧妙解决跨域难题?

什么是跨域 跨域是浏览器受同源&#xff08;协议、域名、端口&#xff09;策略的限制&#xff0c;不允许不同源的站点之间进行某些操作&#xff08;如发送ajax请求&#xff0c;操作dom&#xff0c;读取cookie&#xff09;&#xff0c;如果不进行特殊配置是不能操作成功的&…

Linux中多路IO复用

首先要明白为什么要使用 多路IO复用 单进程/单线程要处理多个阻塞事件的时候会面临抉择&#xff0c;设置阻塞还是非阻塞呢&#xff1f;阻塞的话消息可能得不到及时的处理&#xff0c;就像排队买饭前边的饭卡丢了一堆人等他找饭卡&#xff0c;找到后才能接着打饭&#xff0c;非…

【MySQL】深入理解隔离性

深入理解隔离性 一、数据库并发的场景二、多版本并发控制&#xff08; MVCC &#xff09;三、三个前提知识1、3个记录隐藏字段2、undo日志 四、快照的概念五、Read View六、隔离级别RR与RC的本质区别 一、数据库并发的场景 数据库并发的场景总共有三种&#xff1a; 读-读&…

JVM中一次完整的GC回收流程

JVM堆内存结构简述 JVM堆内存结构图 堆初体验 所有的对象实例以及数组都要在堆上分配&#xff0c;堆是垃圾收集器管理的主要区域&#xff0c;也被称为“GC 堆”&#xff0c;也是我们优化最多考虑的地方。因为在一个项目中&#xff0c;会不断地创建对象&#xff0c;都是在堆里…

DevOps 教程 (4) - CI/CD 整合

在本第四章的"DevOps 教程"系列中&#xff0c;我们将介绍CI/CD整合的概念和实践。我们会介绍DevOps所带来的好处&#xff0c;包括团队协作、开发效率和产品交付速度的显著提升。 我们还将讨论在DevOps中的不同角色&#xff0c;并理解每个角色在持续集成和持续交付中的…

微调实操一: 增量预训练(Pretraining)

1、前言 《微调入门篇:大模型微调的理论学习》我们对大模型微调理论有了基本了解,这篇结合我们现实中常见的场景,进行大模型微调实操部分的了解和学习,之前我有写过类似的文章《实践篇:大模型微调增量预训练实践(二)》利用的MedicalGPT的源码在colab进行操作, 由于MedicalGPT代…

RAG +milvus示例

GitHub - NVIDIA/DeepLearningExamples: State-of-the-Art Deep Learning scripts organized by models - easy to train and deploy with reproducible accuracy and performance on enterprise-grade infrastructure. Towhee GitHub Zilliz GitHub

【交流】IGBT及驱动电路

最近要设计一款IGBT的驱动IC&#xff0c;学习了大部分的驱动电路。偶有心得&#xff0c;总结如下&#xff1a; 1、IGBT工作于大电流大电压的状态&#xff0c;这就要求其开关特性要好。尽量让IGBT工作在这种状态&#xff0c;I*V最小。换句话说&#xff0c;当有大电流时&#xf…

【LeetCode】216. 组合总和 III(中等)——代码随想录算法训练营Day25

题目链接&#xff1a;216. 组合总和 III 题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回…

浅压缩、深压缩、双引擎、计算机屏幕编码……何去何从?

专业视听领域尤其显示控制和坐席控制领域&#xff0c;最近几年最激动人心的技术&#xff0c;莫过于分布式了。 分布式从推出之日就备受关注&#xff1a;担心稳定性的&#xff0c;质疑同步性能的&#xff0c;怀疑画面质量的…… 诚然&#xff0c;我们在此前见多了带着马赛克的…

2024美赛数学建模问题D题思路模型分析——大湖水问题

问题 D: 大湖水问题 背景 美国和加拿大的五大湖是世界上最大的淡水湖群。这五个湖泊及其相连的水道构成了一个庞大的排水盆地&#xff0c;在这两个国家有许多大型城市&#xff0c;气候各异&#xff0c;局部天气条件各异。 湖泊的水被用于许多用途&#xff08;捕鱼、娱乐、发电…

【C++】类和对象1:类的定义、访问限定符、作用域及对象大小

前言 本文主要是简单的介绍一下类是什么、如何使用 类的定义 class className { // 类体&#xff1a;由成员函数和成员变量组成 };// 一定要注意后面的分号class为定义类的关键字&#xff0c;ClassName为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面…

智慧文旅:驱动文化与旅游融合发展的新动力

随着科技的快速发展和人们生活水平的提高&#xff0c;文化和旅游的融合成为了时代发展的必然趋势。智慧文旅作为这一趋势的引领者&#xff0c;通过先进的信息技术手段&#xff0c;推动文化与旅游的深度融合&#xff0c;为产业的发展注入新的活力。本文将深入探讨智慧文旅如何成…

【ASP.NET Core 基础知识】--身份验证和授权--使用Identity进行身份验证

一、Identity的基础知识 1.1 Identity的组成 在ASP.NET Core中&#xff0c;Identity是一个用于处理用户身份验证和授权的框架。它包含了一系列组件&#xff0c;用于管理用户、角色、声明等身份相关的功能。以下是ASP.NET Core Identity的主要组成部分&#xff1a; User Mana…

解决C#中无限递归导致的System.StackOverflowException异常

目录 背景&#xff1a; 错误示例分析: 为什么是错误的&#xff1f; 正确的使用递归&#xff1a; 修改后的代码&#xff1a; 原理和原因&#xff1a; 结论&#xff1a; 背景&#xff1a; 在软件开发中&#xff0c;递归是一种常见的编程技术&#xff0c;它允许方法调用自…

动态数码管实验

数码管动态显示原理 动态显示的特点是将所有数码管的段选线并联在一起&#xff0c;由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选&#xff0c;利用发光管的余辉和人眼视觉暂留作用&#xff0c;使人…

signalR+websocket:实现消息实时通讯——技能提升

signalR 解决步骤1&#xff1a;npm install microsoft/signalr6.0.6 安装指定版本的microsoft/signalr&#xff0c;我这边安装的版本是6.0.6 解决步骤2&#xff1a;引入import * as signalR from microsoft/signalr; import * as signalR from microsoft/signalr; 下面第三…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏9(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言回收物品素材绘制UI代码控制垃圾桶回收功能效果 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&#xff0c;我们将…