Files
map-client-vue/web/VUE_ERROR_DEBUG.md
2025-10-14 14:18:20 +08:00

216 lines
5.1 KiB
Markdown

# Vue 错误调试指南
## 错误信息
```
[Vue warn]: Unhandled error during execution of component update
at <MCPSettings>
```
## 可能的原因
### 1. 响应式数据更新错误
- `formData` reactive 对象更新时出错
- `server` prop 包含不可序列化的数据
- 循环引用
### 2. 组件渲染错误
- MCPServerDetail 组件的某个属性访问出错
- v-if 条件渲染时的空指针
- 计算属性返回错误
### 3. 事件处理器错误
- @back, @save 等事件处理函数抛出异常
- async 函数中的 Promise 被拒绝
## 已实施的修复
### 修复 1: 增强 updateFormData 错误处理
```typescript
const updateFormData = (server: MCPServerConfig) => {
try {
formData.name = server.name || ''
formData.description = server.description || ''
formData.type = server.type || 'http'
formData.url = server.url || ''
formData.headers = Array.isArray(server.headers) ? server.headers : []
serverEnabled.value = server.enabled !== false
} catch (error) {
console.error('❌ updateFormData 出错:', error)
throw error
}
}
```
### 修复 2: 添加 watch 错误捕获
```typescript
watch(() => props.server, (newServer) => {
if (newServer) {
try {
updateFormData(newServer)
initializeToolSettings(newServer)
} catch (error) {
console.error('❌ 更新表单数据失败:', error)
}
}
}, { immediate: true })
```
### 修复 3: 组件初始化验证
```typescript
try {
console.log('🎯 MCPServerDetail 组件加载')
console.log('📦 接收到的 server prop:', props.server)
if (!props.server) {
console.warn('⚠️ server prop 为空')
}
} catch (error) {
console.error('❌ 组件初始化错误:', error)
}
```
## 调试步骤
### 1. 刷新页面
访问新的端口: **http://localhost:5174/**
强制刷新: `Cmd + Shift + R`
### 2. 打开控制台
`Cmd + Option + I` → Console 标签
### 3. 清除所有日志
点击 Console 的 "Clear console" 图标
### 4. 点击编辑按钮
观察控制台输出的顺序:
```
🔍 [1] 打开服务器详情被调用
🔍 [2] 服务器数据: {...}
🔍 [3] 当前 showServerDetail 值: false
🔍 [4] editingServer 设置完成: {...}
✅ [5] showServerDetail 设置为 true
✅ [6] 最终状态检查
🎯 MCPServerDetail 组件加载
📦 接收到的 server prop: {...}
👀 MCPServerDetail watch 触发
📝 更新表单数据: {...}
✅ formData 更新完成
```
### 5. 查找红色错误
如果有错误,会在某个步骤后出现红色文字
## 具体检查项
### A. 如果错误在步骤 [4] 之前
问题在 `openServerDetail` 函数
### B. 如果错误在 "MCPServerDetail 组件加载" 之后
问题在组件的 setup 阶段
**检查项**:
- [ ] `props.server` 是否为对象
- [ ] `props.server` 是否有 name, url, type 等必需字段
- [ ] 是否有循环引用
**控制台执行**:
```javascript
// 检查 server 数据结构
const server = {你复制的server对象}
console.log('name:', server.name)
console.log('url:', server.url)
console.log('type:', server.type)
console.log('headers:', server.headers)
```
### C. 如果错误在 "更新表单数据" 之后
问题在 `updateFormData``initializeToolSettings`
**可能原因**:
- `server.type` 不是 'http' | 'sse' | 'websocket'
- `server.headers` 不是数组
- `server.capabilities` 结构错误
### D. 如果没有任何日志
代码没有更新,需要:
1. 停止旧的开发服务器
2. 确认在正确的端口 (5174)
3. 清除浏览器缓存
## 快速修复脚本
如果还是有错误,在控制台执行:
```javascript
// 1. 检查当前状态
console.log('当前URL:', window.location.href)
console.log('应该是:', 'http://localhost:5174/')
// 2. 查找所有错误
const errors = []
window.addEventListener('error', e => {
errors.push(e)
console.error('捕获到错误:', e)
})
// 3. 查看 server 数据
const servers = Array.from(document.querySelectorAll('.server-card'))
console.log('服务器卡片数量:', servers.length)
// 4. 模拟点击
const editBtn = Array.from(document.querySelectorAll('button'))
.find(b => b.textContent.includes('编辑'))
if (editBtn) {
console.log('找到编辑按钮,尝试点击...')
editBtn.click()
}
```
## 临时解决方案
如果错误持续,可以尝试简化组件:
1. 注释掉部分内容,逐步找出问题
2. 使用简单的 alert 替代复杂的表单
3. 先显示纯文本,再逐步添加功能
## 需要提供的信息
请提供以下截图或信息:
1. **完整的控制台错误信息**(包括堆栈跟踪)
2. **错误出现在哪个步骤之后**
3. **点击编辑前的 server 对象**(复制整个对象)
4. **浏览器和版本**
格式示例:
```
错误: TypeError: Cannot read property 'xxx' of undefined
堆栈:
at updateFormData (MCPServerDetail.vue:xxx)
at eval (MCPServerDetail.vue:xxx)
at callWithErrorHandling (runtime-core.esm-bundler.js:xxx)
server 对象:
{
id: "xxx",
name: "test",
url: "http://0.0.0.0:3100/mcp",
type: "http",
status: "disconnected",
enabled: true
}
```
## 下一步
1. 访问 http://localhost:5174/
2. 强制刷新页面
3. 清除控制台
4. 点击编辑
5. 复制完整的控制台输出给我
让我知道结果!