mirror of
https://github.com/rachelos/we-mp-rss.git
synced 2026-11-05 18:55:26 +08:00
5.7 KiB
5.7 KiB
环境异常统计接口返回 null 问题修复
问题描述
统计接口返回 null,前端页面无法正确显示统计数据。
问题原因
后端问题
-
错误的数据返回格式
- 当 Redis 未连接或没有数据时,返回
{"error": "Redis未连接"} - 这导致前端无法正确解析数据结构
- 当 Redis 未连接或没有数据时,返回
-
缺少默认值处理
hgetall和lrange返回None时没有处理total计数可能返回None
-
不一致的返回类型
- 错误时返回字典包含
error字段 - 正常时返回字典包含统计数据
- 前端无法区分这两种情况
- 错误时返回字典包含
前端问题
-
缺少错误处理
- 没有处理 API 失败的情况
- 没有设置默认值
-
数据解析不完整
- 没有检查返回数据的有效性
- 没有处理字段缺失的情况
修复方案
后端修复 (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
测试内容:
- ✅ Redis 未连接时返回默认值
- ✅ 所有必需字段都存在
- ✅ 字段类型正确
- ✅ API 响应格式正确
- ✅ 前端可以正确解析数据
数据流程
正常情况
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- 测试脚本
总结
修复后的系统:
- 统一数据格式 - 始终返回相同结构的数据
- 完善错误处理 - 各种异常情况都有默认值
- 前端友好 - 不需要特殊处理错误情况
- 用户体验好 - 明确提示无数据,而不是显示错误
现在可以正常访问和显示环境异常统计数据了!