当前位置: 首页 > news >正文

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>

效果验证

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

经验总结

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

http://www.jsqmd.com/news/336074/

相关文章:

  • 读数字时代的网络风险管理:策略、计划与执行06战略和执行(下)
  • <span class=“js_title_inner“>一部书海纳三千年智慧,没它就出不了诸葛亮、王阳明</span>
  • Vue—— Vue3 + Node.js 后台管理系统 之 【 细节优化技巧】
  • Vue—— Vue3 + Node.js 后台管理系统 之 【响应式数据处理】
  • 基于Spring Boot的在线招聘平台设计与实现
  • 2026年靠谱的江苏余热锅炉/余热锅炉厂家热卖产品推荐(近期) - 行业平台推荐
  • 【深度学习】全连接、卷积神经网络
  • 印度AI炸了!全行业万能帮
  • 告别CV大法:我用结构化Prompt,让Claude Code成为我的Python“高级工程师”
  • 2026年比较好的江苏烧结余热锅炉/江苏焦炉余热锅炉行业内知名厂家推荐 - 行业平台推荐
  • 2026年口碑好的江苏潍柴发电机/发电机口碑厂家汇总 - 行业平台推荐
  • 2026年质量好的江苏康明斯发电机/江苏上柴发电机品牌厂商推荐(更新) - 行业平台推荐
  • 2026年质量好的柴油发电机组/珀金斯柴油发电机用户口碑认可厂家 - 行业平台推荐
  • 2026年口碑好的柴油发电机/江苏柴油发电机厂家怎么挑 - 行业平台推荐
  • <span class=“js_title_inner“>Agent for Network:基于MCP的智能体平台研发与场景落地</span>
  • <span class=“js_title_inner“>燃油车底盘落伍了?错了,燃油车底盘技术对电车来说更重要了</span>
  • 2026年热门的浙江塑料甲油盖/定制甲油盖厂家推荐与选购指南 - 行业平台推荐
  • 架构设计怎么做:一套可复用、可落地的方法论
  • 设计百万 QPS / 百万 TPS 系统的方法论:从“数字”走向“可落地架构”
  • cursor apifox是最好用的工具
  • 超越GIL:深入Python并发编程的迷思与现代实践
  • 2026年靠谱的单体甲油胶盖/甲油胶盖厂家热卖产品推荐(近期) - 行业平台推荐
  • 2026年知名的浙江塑料甲油盖/双体甲油盖高评价厂家推荐 - 行业平台推荐
  • 2026年质量好的浙江定制甲油胶盖/可降解甲油胶盖厂家推荐清单 - 行业平台推荐
  • Python 异步上下文管理器深度解析:从 `with` 到 `async with` 的进化之旅
  • <span class=“js_title_inner“>软硬协同、自主可控!先临三维SHINING3D Inspect全新工业计量三维检测软件赋能智能制造</span>
  • <span class=“js_title_inner“>【厦门大学-曹刘娟组-arXiv25】进化,而非训练:通过进化提示实现零样本推理分割</span>
  • <span class=“js_title_inner“>网络流量监控神器 , Wireshark看着太累了</span>
  • 3. 关键要点:添加`id`后建议给原有联合字段加唯一索引,确保业务数据不重复;实体类需同步添加`id`字段并标记`@TableId`注解。
  • uni-app 之 uni.showActionSheet