# 网络连接问题解决方案

## 问题描述

在产品同步过程中遇到 `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`，生产环境应移除
- 根据实际网络环境调整超时和重试参数
- 定期检查和更新网络配置