news 2026/4/16 9:01:40

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/4/16 7:46:35

<span class=“js_title_inner“>网络流量监控神器 , Wireshark看着太累了</span>

如果你想知道电脑在后台偷偷连哪些服务器,但Wireshark那界面看着头疼。命令行工具吧,又不够直观。Sniffnet这个项目就是专门解决这个痛点的。GitHub上32.2K星了,Rust写的跨平台网络流量监控工具,界面漂亮得不像开源软件,功能还特别全。实时图表、地理位置、域名解析、自定义通知…

作者头像 李华
网站建设 2026/4/15 23:04:02

<span class=“js_title_inner“>[今日战况]创新高了!黄金有色吃大肉!ETF三因子轮动实盘跟踪!股票量化分析工具QTYX-V3.3.6</span>

前言 我们的股票量化系统QTYX在实战中不断迭代升级!!!分享QTYX系统目的是提供给大家一个搭建量化系统的模版&#xff0c;帮助大家搭建属于自己的系统。因此我们提供源码&#xff0c;可以根据自己的风格二次开发。 关于QTYX的使用攻略可以查看链接&#xff1a;QTYX使用攻略QTYX一…

作者头像 李华
网站建设 2026/4/16 7:48:45

树莓派5+ubuntu24.04+openclaw使用记录

1 安装openclaw 参考连接&#xff08;一键安装openclaw&#xff09;&#xff1a; 官网 https://openclaw.ai/ 菜鸟 OpenClaw (Clawdbot) 教程 | 菜鸟教程 中文文档 https://holtchas.github.io/openclaw-docs-zh/sta…

作者头像 李华
网站建设 2026/4/16 5:39:45

告别Docker拉取超时!三分钟搞定镜像加速与配置文件优化

摘要&#xff1a;本文手把手教你解决Docker拉取镜像时常见的超时错误&#xff0c;通过配置国内镜像源和优化daemon.json文件&#xff0c;让你的Docker体验飞起来&#xff01;最近在部署Docker环境时&#xff0c;你是否也遇到过这样的报错&#xff1f; Error response from daem…

作者头像 李华
网站建设 2026/4/16 5:43:04

<span class=“js_title_inner“>让 AI 也能当“反洗钱专家“——一个通俗易懂的模型训练故事</span>

故事的开端&#xff1a;为什么要做这件事?想象一下,你是一家银行的合规专员。每天要面对厚厚的反洗钱法规文件,还要分析各种复杂的可疑交易案例。有些问题特别棘手:法律条文晦涩难懂,一个条款套着另一个条款真实的洗钱案例千奇百怪,要从蛛丝马迹中发现问题有时候一个问题涉及好…

作者头像 李华
网站建设 2026/4/15 8:19:20

堪比图吧工具箱!入梦工具箱 近百种硬件检测工具

下载链接https://pan.freedw.com/s/aHdahn给需要硬件检测的小伙伴推荐一款实用工具 —— 入梦工具箱&#xff0c;它和热门的图吧工具箱功能几乎一模一样&#xff0c;同样收集了近百种各类硬件检测工具&#xff0c;不管是检测电脑配置、排查硬件故障&#xff0c;还是性能测试&am…

作者头像 李华