news 2026/9/18 17:31:03

Vue—— Vue3 + Node.js 后台管理系统 之 【错误处理与监控】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue—— Vue3 + Node.js 后台管理系统 之 【错误处理与监控】

背景问题

在生产环境中,错误处理和监控是保证应用稳定性的重要环节。

方案思考

  • 如何统一错误处理
  • 如何收集错误信息
  • 如何上报错误日志

具体实现

错误处理系统:

// utils/errorHandler.ts - 错误处理系统import{App}from'vue';// 错误类型定义interfaceErrorInfo{type:'js'|'resource'|'promise'|'ajax';message:string;stack?:string;url?:string;line?:number;column?:number;timestamp:number;userAgent?:string;customInfo?:any;}// 错误上报配置interfaceReportConfig{url:string;enable:boolean;level:'error'|'warn'|'info';samplingRate?:number;// 采样率}classErrorHandler{privateconfig:ReportConfig;privatequeue:ErrorInfo[]=[];privateisReporting=false;constructor(config:ReportConfig){this.config={samplingRate:1,...config};this.init();}privateinit(){// 捕获JavaScript错误window.addEventListener('error',this.handleError.bind(this));// 捕获Promise错误window.addEventListener('unhandledrejection',this.handlePromiseRejection.bind(this));// 捕获资源加载错误window.addEventListener('error',this.handleResourceError.bind(this),true);}privatehandleError(event:ErrorEvent){consterrorInfo:ErrorInfo={type:'js',message:event.message,stack:event.error?.stack,url:event.filename,line:event.lineno,column:event.colno,timestamp:Date.now(),userAgent:navigator.userAgent};this.report(errorInfo);}privatehandlePromiseRejection(event:PromiseRejectionEvent){consterrorInfo:ErrorInfo={type:'promise',message:event.reason?.message||String(event.reason),stack:event.reason?.stack,timestamp:Date.now(),userAgent:navigator.userAgent};this.report(errorInfo);}privatehandleResourceError(event:ErrorEvent){if(event.target!==window){consttarget=event.targetasHTMLScriptElement|HTMLLinkElement|HTMLImageElement;consterrorInfo:ErrorInfo={type:'resource',message:`Resource load error:${target.src||target.href}`,url:target.src||target.href,timestamp:Date.now(),userAgent:navigator.userAgent};this.report(errorInfo);}}publicreport(errorInfo:ErrorInfo){// 采样率控制if(Math.random()>(this.config.samplingRate||1)){return;}// 级别过滤if(this.shouldReport(errorInfo)){this.queue.push(errorInfo);this.scheduleReport();}}privateshouldReport(errorInfo:ErrorInfo):boolean{if(!this.config.enable)returnfalse;switch(this.config.level){case'error':returnerrorInfo.type==='js'||errorInfo.type==='promise';case'warn':returntrue;default:returntrue;}}privatescheduleReport(){if(this.isReporting)return;this.isReporting=true;setTimeout(()=>{this.flushQueue();this.isReporting=false;},1000);}privateflushQueue(){if(this.queue.length===0)return;constdata=JSON.stringify(this.queue);this.queue=[];// 发送错误报告if('sendBeacon'innavigator){navigator.sendBeacon(this.config.url,data);}else{fetch(this.config.url,{method:'POST',body:data,headers:{'Content-Type':'application/json'}}).catch(()=>{// 忽略上报错误});}}}// 创建全局错误处理器实例exportconstglobalErrorHandler=newErrorHandler({url:'/api/errors/report',enable:true,level:'error'});// 在main.ts中注册exportfunctionregisterErrorHandler(app:App){// 捕获组件错误app.config.errorHandler=(err,instance,info)=>{// 上报错误globalErrorHandler.report({type:'js',message:err.message,stack:err.stack,timestamp:Date.now(),customInfo:{component:instance?.$options.name,lifecycle:info}});returnfalse;// 阻止错误继续向上传播};returnglobalErrorHandler;}

错误边界组件:

<!-- components/ErrorBoundary.vue --> <script setup lang="ts"> import { ref, onErrorCaptured } from 'vue'; const hasError = ref(false); const errorMessage = ref(''); onErrorCaptured((err, instance, info) => { hasError.value = true; errorMessage.value = err.message; // 上报错误 globalErrorHandler.report({ type: 'js', message: err.message, stack: err.stack, timestamp: Date.now(), customInfo: { component: instance?.$options.name, lifecycle: info } }); return false; // 阻止错误继续向上传播 }); const handleReset = () => { hasError.value = false; errorMessage.value = ''; }; </script> <template> <div v-if="!hasError"> <slot /> </div> <div v-else class="error-boundary"> <h3>出错了!</h3> <p>{{ errorMessage }}</p> <button @click="handleReset">重试</button> </div> </template>

效果验证

通过统一的错误处理系统,可以有效地捕获、记录和上报各种类型的错误,提高应用的稳定性。

经验总结

错误处理应该是系统性的,需要从前端到后端建立完整的错误监控体系。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 7:51:27

uni-app 之 设置导航

uni-app 提供了一系列 API 来动态设置页面导航栏的样式和状态&#xff0c;帮助开发者创建更丰富的用户界面体验。 1. uni.setNavigationBarTitle(OBJECT) 动态设置当前页面的标题 参数说明 属性类型必填说明titlestring是页面标题successfunction否接口调用成功的回调函数f…

作者头像 李华
网站建设 2026/9/15 9:35:01

光刻胶用屏蔽剂

一、光刻胶对光屏蔽剂性能的具体详细要求光屏蔽剂的核心作用是控制光在光刻胶膜中的传播行为&#xff0c;其主要性能要求可归纳为以下几点&#xff1a;精确的光学特性&#xff08;核心要求&#xff09;在曝光波长下具有高吸收系数&#xff08;α&#xff09;&#xff1a;这是最…

作者头像 李华
网站建设 2026/9/16 21:37:07

<span class=“js_title_inner“>1篇搞懂AI通识:大白话拆解核心点</span>

引言随着 AI 技术从实验室走向日常&#xff0c;“机器学习”“大模型”“Transformer”“MOE” 等词汇已不再是技术圈的专属。从智能聊天助手到电商推荐&#xff0c;从语音识别到自动驾驶&#xff0c;AI 正以多元形态融入生活。这篇文章按 “基础→核心→优化→落地→工具→术语…

作者头像 李华
网站建设 2026/9/7 2:37:20

which命令

which命令&#xff0c;查看所使用的一系列命令的程序文件存放在哪里语法:which要查找的命令find 用于查找指定的文件按文件名查找:find起始路径 -name"被查找文件名"支持通配符按文件大小查找:find 起始路径-size1-n[kMG]

作者头像 李华
网站建设 2026/9/12 8:58:50

<span class=“js_title_inner“>ZYNQ MPSOC VCU介绍</span>

1 什么是VCU?VCU 的全称是 Video Codec Unit&#xff0c;即视频编解码单元&#xff0c; Zynq UltraScale MPSoC 系列产品分为三种类型&#xff0c;分别是 CG 型器件、 EG 型器件和 EV 型器件&#xff0c; 其中只有 EV 型器件集成了 VCU。 VCU 适用于视频监控和网络视频连接应用…

作者头像 李华