Files
we-mp-rss/docs/env-exception-api-fix.md
T
2026-03-06 00:50:13 +08:00

5.7 KiB

环境异常统计接口返回 null 问题修复

问题描述

统计接口返回 null,前端页面无法正确显示统计数据。

问题原因

后端问题

  1. 错误的数据返回格式

    • 当 Redis 未连接或没有数据时,返回 {"error": "Redis未连接"}
    • 这导致前端无法正确解析数据结构
  2. 缺少默认值处理

    • hgetall 和 lrange 返回 None 时没有处理
    • total 计数可能返回 None
  3. 不一致的返回类型

    • 错误时返回字典包含 error 字段
    • 正常时返回字典包含统计数据
    • 前端无法区分这两种情况

前端问题

  1. 缺少错误处理

    • 没有处理 API 失败的情况
    • 没有设置默认值
  2. 数据解析不完整

    • 没有检查返回数据的有效性
    • 没有处理字段缺失的情况

修复方案

后端修复 (core/redis_client.py)

1. 定义默认返回值

default_stats = {
    "date": date or datetime.now().strftime("%Y-%m-%d"),
    "total": 0,
    "urls": {},
    "mp_stats": {},
    "recent_logs": []
}

2. 统一返回格式

无论是否成功,都返回相同的数据结构:

def get_env_exception_stats(self, date: Optional[str] = None) -> Dict[str, Any]:
    # 默认返回值
    default_stats = {...}
    
    if not self.is_connected:
        print_warning("Redis未连接,返回默认统计信息")
        return default_stats
        
    try:
        # 获取数据...
        return {
            "date": date,
            "total": total,  # 确保是整数
            "urls": urls or {},  # 确保是字典
            "mp_stats": mp_stats or {},  # 确保是字典
            "recent_logs": logs or []  # 确保是列表
        }
    except Exception as e:
        return default_stats

3. 移除错误字段

不再返回 {"error": "..."},而是返回带有默认值的统计数据。

前端修复 (web_ui/src/api/envException.ts)

1. 添加错误处理

export const getEnvExceptionStats = async (date?: string): Promise<EnvExceptionStats> => {
  try {
    const params = date ? { date } : {}
    const response = await http.get('/env-exception/stats', { params })
    
    // 确保返回数据格式正确
    const data = response.data?.data || response.data || {}
    
    return {
      date: data.date || new Date().toISOString().split('T')[0],
      total: data.total || 0,
      urls: data.urls || {},
      mp_stats: data.mp_stats || {},
      recent_logs: data.recent_logs || []
    }
  } catch (error) {
    console.error('获取环境异常统计失败:', error)
    // 返回默认值
    return {
      date: date || new Date().toISOString().split('T')[0],
      total: 0,
      urls: {},
      mp_stats: {},
      recent_logs: []
    }
  }
}

2. 数据验证

确保所有字段都存在且类型正确:

return {
  date: result.date || new Date().toISOString().split('T')[0],
  total: result.total || 0,
  urls: result.urls || {},
  mp_stats: result.mp_stats || {},
  recent_logs: result.recent_logs || []
}

前端页面修复 (web_ui/src/views/EnvExceptionStats.vue)

1. 改进错误处理

const loadStats = async () => {
  loading.value = true
  try {
    const date = selectedDate.value || new Date().toISOString().split('T')[0]
    const result = await getEnvExceptionStats(date)
    
    // 确保数据有效
    stats.value = {
      date: result.date || date,
      total: result.total || 0,
      urls: result.urls || {},
      mp_stats: result.mp_stats || {},
      recent_logs: result.recent_logs || []
    }
    
    // 如果没有数据,显示提示
    if (stats.value.total === 0) {
      Message.info('该日期暂无环境异常记录')
    }
  } catch (error: any) {
    Message.error(error.message || '加载统计失败')
    // 设置默认值
    stats.value = {
      date: selectedDate.value || new Date().toISOString().split('T')[0],
      total: 0,
      urls: {},
      mp_stats: {},
      recent_logs: []
    }
  } finally {
    loading.value = false
  }
}

测试验证

运行测试脚本:

python test_api_response.py

测试内容:

  1. ✅ Redis 未连接时返回默认值
  2. ✅ 所有必需字段都存在
  3. ✅ 字段类型正确
  4. ✅ API 响应格式正确
  5. ✅ 前端可以正确解析数据

数据流程

正常情况

1. 前端调用 API
   ↓
2. 后端从 Redis 获取数据
   ↓
3. 返回统计数据
   {
     "code": 0,
     "message": "success",
     "data": {
       "date": "2024-01-01",
       "total": 10,
       "urls": {...},
       "mp_stats": {...},
       "recent_logs": [...]
     }
   }
   ↓
4. 前端解析并显示

异常情况

1. 前端调用 API
   ↓
2. Redis 未连接或查询失败
   ↓
3. 返回默认统计数据
   {
     "code": 0,
     "message": "success",
     "data": {
       "date": "2024-01-01",
       "total": 0,
       "urls": {},
       "mp_stats": {},
       "recent_logs": []
     }
   }
   ↓
4. 前端显示空状态提示

兼容性

  • ✅ 向后兼容:不影响现有功能
  • ✅ 优雅降级:Redis 故障时仍可访问
  • ✅ 用户友好:明确提示无数据情况

相关文件

  • core/redis_client.py - Redis 客户端修复
  • web_ui/src/api/envException.ts - API 接口修复
  • web_ui/src/views/EnvExceptionStats.vue - 页面组件修复
  • test_api_response.py - 测试脚本

总结

修复后的系统:

  1. 统一数据格式 - 始终返回相同结构的数据
  2. 完善错误处理 - 各种异常情况都有默认值
  3. 前端友好 - 不需要特殊处理错误情况
  4. 用户体验好 - 明确提示无数据,而不是显示错误

现在可以正常访问和显示环境异常统计数据了!