# 网络连接问题解决方案 ## 问题描述 在产品同步过程中遇到 `ECONNRESET` 错误,导致同步失败。 ## 错误分析 ### ECONNRESET 错误原因 `ECONNRESET` 是一个网络连接重置错误,通常由以下原因引起: 1. **服务器主动断开连接** - 服务器负载过高 - 服务器配置的连接超时 - 服务器重启或维护 2. **网络不稳定** - 网络延迟过高 - 网络丢包 - 防火墙或代理干预 3. **SSL/TLS 握手问题** - 证书验证失败 - SSL 协议版本不匹配 4. **客户端配置问题** - 请求频率过高 - 缺少适当的重试机制 - 连接池配置不当 ## 解决方案 ### 1. 添加重试机制 ```typescript // 重试配置 const maxRetries = 3; const retryDelay = 1000; // 1秒 // 指数退避重试 const delay = retryDelay * Math.pow(2, retryCount - 1); await new Promise(resolve => setTimeout(resolve, delay)); ``` ### 2. 优化网络请求配置 ```typescript const config: AxiosRequestConfig = { method: 'GET', url: `${wpApiUrl}/wp-json${endpoint}`, headers: { Authorization: `Basic ${auth}`, 'Connection': 'keep-alive', 'User-Agent': 'API-Client/1.0' }, // 添加超时配置 timeout: 30000, // 30秒超时 // 优化SSL配置 httpsAgent: new (require('https').Agent)({ rejectUnauthorized: false, // 仅用于开发环境 keepAlive: true, keepAliveMsecs: 1000, maxSockets: 5, maxFreeSockets: 2 }), }; ``` ### 3. 错误处理和日志记录 ```typescript try { const response = await axios.request(config); // 处理成功响应 } catch (error) { if (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.code === 'ENOTFOUND') { console.warn(`网络连接错误 (${error.code}),第 ${retryCount} 次重试...`); // 重试逻辑 } else { console.error(`获取数据失败:`, error.message); throw new Error(`网络请求失败: ${error.message}`); } } ``` ### 4. 请求频率控制 ```typescript // 添加页面间的延迟,避免过于频繁的请求 if (hasMore) { await new Promise(resolve => setTimeout(resolve, 200)); } ``` ## 最佳实践 ### 1. 连接池优化 - 使用 `keepAlive: true` 保持连接复用 - 合理设置 `maxSockets` 和 `maxFreeSockets` - 避免创建过多并发连接 ### 2. 超时配置 - 设置合理的请求超时时间(建议 30-60 秒) - 根据网络环境调整超时参数 ### 3. 重试策略 - 使用指数退避算法 - 限制最大重试次数 - 只对特定错误类型进行重试 ### 4. 错误监控 - 记录详细的错误日志 - 监控网络请求成功率 - 设置告警机制 ## 代码实现 已在 `wp.service.ts` 的 `fetchPagedData` 方法中实现以下改进: 1. ✅ 添加重试机制(最多重试3次) 2. ✅ 实现指数退避算法 3. ✅ 优化 HTTPS Agent 配置 4. ✅ 添加请求超时设置 5. ✅ 改进错误处理和日志记录 6. ✅ 添加请求间隔控制 ## 预期效果 - 减少因网络波动导致的同步失败 - 提高产品同步的成功率和稳定性 - 提供更好的错误信息和调试支持 - 避免对服务器造成过大压力 ## 监控建议 1. 监控重试次数和成功率 2. 记录网络错误的发生频率 3. 观察同步任务的完成时间 4. 设置异常告警机制 ## 注意事项 - 开发环境中使用 `rejectUnauthorized: false`,生产环境应移除 - 根据实际网络环境调整超时和重试参数 - 定期检查和更新网络配置