6.6 KiB
6.6 KiB
错误日志分析报告
📊 发现的问题
✅ 好消息:上传实际上是成功的!
日志显示用户成功上传了一个大文件:
[Upload] Starting upload process...
[Upload] Session checked: true
[Upload] Parsing form data...
[Upload] Form data received: {
hasPreviewImage: true,
previewImageSize: 7767711, // 7.4MB 预览图
hasZipFile: true,
zipFileSize: 469257003, // 447MB 压缩包!
productModel: 'DNZ0117',
categoryName: '大货颜选',
sceneName: '电竞'
}
[Upload] User found: 魔力红
[Upload] Processing image... (image/png, 7585.66KB)
图片处理完成: 2000x3226 -> 600x968, 7585.66KB -> 64.51KB, 质量: 80
[Upload] Image processed successfully
[Upload] Image uploaded to S3: https://s3.1080p.hk/jsxiangche/preview-1760954541032-03_3..webp
[Upload] Zip file saved: uploads/zip-1760954541550-f4ed9fb04f7a4d988253fa391107824d.7z (447.52 MB)
[Upload] Creating database record...
[Upload] Database record created: d99d8ce6-8283-499f-8f9f-5946a9819e1c
[Upload] Upload completed successfully!
关键发现:
- ✅ 447MB 的大文件上传成功
- ✅ 图片处理成功(压缩到64KB)
- ✅ S3 上传成功
- ✅ 数据库记录创建成功
- ✅ 服务器端显示"Upload completed successfully!"
⚠️ 问题 1: ECONNRESET 错误(上传后)
Error: aborted
at connResetException (node:internal/errors:720:14)
at abortIncoming (node:_http_server:781:17)
at socketOnClose (node:_http_server:775:3)
...
code: 'ECONNRESET'
原因分析:
- 时机: 这个错误发生在上传成功之后
- 根源: 客户端(浏览器)过早关闭了连接
- 可能原因:
- 上传大文件(447MB)耗时较长
- 客户端等待响应超时
- 浏览器或网络中间层的超时设置
影响:
- ❌ 用户可能看到上传失败的提示
- ✅ 但实际上文件已经成功上传到服务器
- ⚠️ 这会让用户误以为上传失败,可能重复上传
⚠️ 问题 2: DNS 解析错误(图片显示)
TypeError: fetch failed
...
cause: Error: getaddrinfo EAI_AGAIN s3.1080p.hk
at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26)
...
errno: -3001,
code: 'EAI_AGAIN',
syscall: 'getaddrinfo',
hostname: 's3.1080p.hk'
原因分析:
- 时机: 图片优化器尝试从 S3 获取图片时
- 根源: DNS 解析失败(无法解析 s3.1080p.hk)
- 可能原因:
- DNS 服务器暂时不可达
- 网络波动
- DNS 缓存问题
影响:
- ⚠️ 图片可能无法正确显示
- ⚠️ Next.js 图片优化功能失败
🔧 解决方案
方案 1: 修复 ECONNRESET 问题(高优先级)
问题根源
上传成功后,服务器返回响应时,客户端连接已经关闭。
解决方法
选项 A: 增加客户端超时时间
在 components/UploadModal.tsx 中,XHR 请求默认没有超时设置。对于大文件,应该:
xhr.timeout = 0; // 不设置超时,或者设置一个很大的值
// 或者
xhr.timeout = 3600000; // 1小时(毫秒)
选项 B: 优化响应时间
当前服务器在完成所有操作后才返回响应。可以改为:
- 接收文件后立即返回响应
- 后台异步处理图片和S3上传
选项 C: 添加心跳机制
在长时间上传过程中,定期发送心跳包保持连接。
方案 2: 修复 DNS 解析问题(中优先级)
临时方案:添加 hosts 解析
在服务器的 /etc/hosts 中添加:
# 在服务器上执行
echo "xxx.xxx.xxx.xxx s3.1080p.hk" >> /etc/hosts
永久方案:配置 DNS
- 检查服务器 DNS 配置
- 使用可靠的 DNS 服务器(如 8.8.8.8, 114.114.114.114)
- 或者使用 S3 的 IP 地址而不是域名
💡 立即实施的修复
修复 1: 增加 XHR 超时时间
修改 components/UploadModal.tsx:
// 在 handleSubmit 中,创建 xhr 后添加:
xhr.timeout = 0; // 禁用超时,适用于大文件上传
// 或者设置一个足够大的值(3小时)
xhr.timeout = 10800000; // 3小时 = 10800秒 * 1000毫秒
修复 2: 改进成功判断逻辑
即使遇到 ECONNRESET,如果上传进度达到 100%,也应该视为成功:
xhr.addEventListener('error', (e) => {
console.error('Upload XHR error:', e)
console.error('XHR status:', xhr.status)
console.error('Progress:', uploadProgress)
// 如果进度已经100%,可能上传实际已成功
if (uploadProgress === 100) {
setError('上传可能已完成,请刷新页面查看。如果未看到文件,请联系管理员。')
// 给用户提示但不标记为完全失败
} else {
// 正常的错误处理
const isConnectionReset = xhr.status === 0
if (isConnectionReset) {
errorMsg = '网络连接中断...'
}
setError(errorMsg)
}
setUploading(false)
})
📊 数据统计
从日志中发现的上传记录:
| 序号 | 用户 | 文件大小 | 产品型号 | 状态 | 时间戳 |
|---|---|---|---|---|---|
| 1 | 魔力红 | 447.52 MB | DNZ0117 | ✅ 成功 | 1760954541 |
| 2 | 未知 | 未知 | 未知 | 🔄 进行中 | 最新 |
🎯 建议行动
立即执行(紧急)
-
通知用户 "魔力红"
- 他的447MB文件实际上已经上传成功
- ID:
d99d8ce6-8283-499f-8f9f-5946a9819e1c - 产品型号:
DNZ0117 - 分类:
大货颜选 / 电竞
-
修复前端超时设置
- 增加 XHR timeout 或禁用超时
- 改进错误处理逻辑
-
检查 S3 DNS
- 测试
s3.1080p.hk域名解析 - 如果不稳定,考虑使用 IP 地址
- 测试
短期优化(本周)
-
添加上传状态检查
- 如果用户重复上传相同文件,给予提示
- 避免重复上传
-
优化响应机制
- 考虑异步处理模式
- 立即返回成功响应,后台处理剩余任务
-
添加监控告警
- 监控 ECONNRESET 频率
- 监控 DNS 解析失败率
✅ 结论
核心发现:
- ✅ 上传功能实际上是正常的,大文件(447MB)可以成功上传
- ⚠️ 问题是客户端超时,导致看起来像失败,但实际已成功
- ⚠️ DNS 问题影响图片显示,但不影响上传
修复优先级:
- P0 - 立即修复: 增加客户端超时时间
- P1 - 短期优化: 改进错误处理逻辑
- P2 - 长期优化: 异步处理机制
报告时间: 2025-10-20 18:05
分析人员: AI Assistant
严重程度: 中等(功能正常但用户体验不佳)