
友友们,早上好啊。今天继续AI工具实战系列。我将分享最近几个月使用ai工具用于工作的那些事。既是一次知识的分享,又是一次自我的一次总结,也希望自己的一些使用经验可以帮助到大家。下面正文开始
本期我主要想分享如何实现项目中的错误监控。
在长江智慧航道数字化管理平台(Vue3 + Vite架构)开发中,按照领导要求需要增加错误监控集成,满足以下核心需求:
和前面一样,简单介绍一下工具和技术栈
向 CodeBuddy 输入需求:
“为 Vue3 项目安装 Sentry SDK,需支持错误追踪和性能监控。”

AI 生成命令:
npm install @sentry/vue @sentry/tracing需求输入:
“在 main.js 中初始化 Sentry,DSN 从环境变量VITE_SENTRY_DSN读取,环境标识为import.meta.env.MODE。”
AI 生成代码:
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import * as Sentry from '@sentry/vue';
import { Integrations } from '@sentry/tracing';
const app = createApp(App);
Sentry.init({
app,
dsn: import.meta.env.VITE_SENTRY_DSN, // 从环境变量读取
environment: import.meta.env.MODE, // 开发/生产环境标识
integrations: [
new Integrations.BrowserTracing(), // 性能监控(可选)
],
});
app.mount('#app');关键点:
测试问题:
“Axios 请求 404 错误未上报到 Sentry。”

AI 诊断与修复:
// src/utils/axios.js
import axios from 'axios';
import * as Sentry from '@sentry/vue';
const api = axios.create();
// 响应拦截器
api.interceptors.response.use(
(response) => response,
(error) => {
if (error.response && error.response.status >= 400) {
Sentry.captureException(error, {
tags: { type: 'axios' },
extra: { url: error.config.url, status: error.response.status },
});
}
return Promise.reject(error);
}
);
export default api;效果:
需求输入:
“捕获 Vue 组件渲染错误(如v-if条件错误)并上报。”
AI 生成代码:
// main.js(在 Sentry.init 后添加)
app.config.errorHandler = (err, vm, info) => {
Sentry.captureException(err, {
tags: { type: 'vue' },
extra: { component: vm?.$.type?.name, info }, // 上报组件名和错误位置
});
};需求补充:
“用户登录后,将用户 ID 和用户名添加到 Sentry 上下文。”

AI 方案:
// 登录成功后调用
function onLoginSuccess(userId, username) {
Sentry.setUser({ id: userId, username });
}
// 登出时清除
function onLogout() {
Sentry.setUser(null);
}原理:
下面我们来看关键代码
在项目根目录创建三环境配置文件:
# .env.development
VITE_SENTRY_DSN=https://xxxx@o123456.ingest.sentry.io/1234567
VITE_SENTRY_ENV=development
VITE_MAP_REGION=dev-yangtze
# .env.production
VITE_SENTRY_DSN=https://xxxx@o123456.ingest.sentry.io/7654321
VITE_SENTRY_ENV=production
VITE_MAP_REGION=prod-yangtzeimport { createApp } from 'vue'
import * as Sentry from '@sentry/vue'
import { BrowserTracing } from '@sentry/tracing'
import App from './App.vue'
import router from './router'
const app = createApp(App)
Sentry.init({
app,
dsn: import.meta.env.VITE_SENTRY_DSN,
environment: import.meta.env.VITE_SENTRY_ENV,
integrations: [
new BrowserTracing({
routingInstrumentation: Sentry.vueRouterInstrumentation(router),
// 自定义航道业务追踪
tracePropagationTargets: [
'/api/hydrology/*',
'/api/ais-data/*',
'/map-tiles/*'
]
})
],
// 自定义错误分组关键字段
fingerprint: ['{{ default }}', '{{ url }}', '{{ user.id }}'],
// 初始上下文(航道区段)
beforeSend(event) {
event.tags = {
...event.tags,
mapRegion: import.meta.env.VITE_MAP_REGION
}
return event
}
})创建src/utils/sentryAxios.js:
import axios from 'axios'
import * as Sentry from '@sentry/vue'
const api = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL
})
// 请求拦截器:添加航道业务标识
api.interceptors.request.use(config => {
const vesselId = localStorage.getItem('currentVesselId')
if (vesselId) {
config.headers['X-Vessel-Id'] = vesselId
}
return config
})
// 响应拦截器:错误上报增强
api.interceptors.response.use(
response => response,
error => {
if (error.response) {
const { status, data } = error.response
// 自定义航道业务错误码处理
if (status >= 400) {
Sentry.captureException(error, {
tags: {
apiEndpoint: error.config.url?.split('?')[0],
errorCode: data?.code || status
},
extra: {
requestParams: error.config.params,
responseData: data
}
})
}
}
return Promise.reject(error)
}
)
export default api在main.js中添加全局错误处理:
// 捕获未处理的组件错误
app.config.errorHandler = (err, instance, info) => {
Sentry.captureException(err, {
tags: {
component: instance?.__name || 'AnonymousComponent',
errorType: info,
// 标记是否为电子航道图组件
isMapComponent: instance?.$options?.name?.includes('Map')
},
contexts: {
// 添加航道业务上下文
vessel: {
id: localStorage.getItem('currentVesselId'),
name: localStorage.getItem('currentVesselName')
},
channelSection: localStorage.getItem('currentSectionId')
}
})
}
// 捕获未处理的Promise错误
window.addEventListener('unhandledrejection', event => {
Sentry.captureException(event.reason, {
tags: {
errorType: 'unhandledRejection'
}
})
})创建src/utils/sentryUser.js:
import * as Sentry from '@sentry/vue'
export function setVesselContext(vesselId, vesselName) {
Sentry.setUser({
id: vesselId,
username: vesselName,
// 扩展航道业务字段
vesselType: localStorage.getItem('vesselType'),
mmsi: vesselId // 船舶MMSI码作为唯一标识
})
// 添加航道区段标签
Sentry.setTag('channelSection', localStorage.getItem('currentSectionId') || 'unknown')
}
// 在船舶登录成功后调用
export function initVesselSession() {
const vesselId = localStorage.getItem('currentVesselId')
if (vesselId) {
setVesselContext(vesselId, localStorage.getItem('currentVesselName'))
}
}

最后简单总结一下经验,总的来说,我们在生成代码时,想让生成的代码更合用,首先得把需求说清楚,尤其要带上业务相关的词,比如 “电子航道图组件”,就像说 “给 Vue3 的航道项目装 Sentry,得能抓到 Mapbox GL 组件的错误”,这样出来的代码才更符合。还有安全方面要注意,要是写代码时把 DSN 直接硬敲进去,CodeBuddy 会自动提醒你改成用环境变量;像船舶位置这种敏感数据,上报之前也得先处理下,把隐私信息遮掉。
另外,想让错误追踪更贴合航道业务,还能这么做:用 beforeSend 和 tags 给错误加个 “航道专属标识”,再用 fingerprint 自己定个错误分组规则,别让差不多的错误散得到处都是。最后说性能监控,还能再扩展下 —— 集成 Sentry Performance,看看航道数据加载要花多久;像解析 AIS 数据这种关键步骤,也可以自己加个事务追踪,盯着它的运行情况。通过 CodeBuddy 的辅助,我们高效完成了 Vue3 项目与 Sentry 的深度集成。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。