平台数据列表页(/analytics/platform)在加载数据时出现 500 错误,错误信息显示:
Unexpected token '<', "<!doctype \"... is not valid JSON
这表明服务器返回的是 HTML 错误页面而不是预期的 JSON 数据。
Python API 服务未运行或连接失败
Node.js 端错误处理不完善
callPythonAnalyticsApi 函数直接调用 resp.json(),没有检查响应状态和内容类型错误信息不明确
callPythonAnalyticsApi 函数文件: server/src/routes/analytics.ts
改进内容:
resp.ok)修复后的代码:
async function callPythonAnalyticsApi(pathname: string, params: Record<string, string | number | undefined>) {
const base = process.env.PYTHON_API_URL || 'http://localhost:5005';
const url = new URL(base);
url.pathname = pathname.startsWith('/') ? pathname : `/${pathname}`;
const search = new URLSearchParams();
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== null) {
search.append(key, String(value));
}
});
url.search = search.toString();
try {
const resp = await fetch(url.toString(), { method: 'GET' });
// 检查响应状态
if (!resp.ok) {
// 尝试解析 JSON 错误响应
let errorData: any;
try {
errorData = await resp.json();
} catch {
// 如果不是 JSON,读取文本内容
const text = await resp.text();
errorData = {
success: false,
error: `Python API 返回错误 (${resp.status}): ${text.substring(0, 500)}`,
};
}
throw new Error(errorData.error || `Python API 返回错误: ${resp.status} ${resp.statusText}`);
}
// 检查 Content-Type
const contentType = resp.headers.get('content-type') || '';
if (!contentType.includes('application/json')) {
const text = await resp.text();
throw new Error(`Python API 返回非 JSON 响应: ${text.substring(0, 500)}`);
}
const json = await resp.json();
return json;
} catch (error: any) {
// 如果是网络错误(连接失败、超时等)
if (error.name === 'TypeError' && error.message.includes('fetch')) {
throw new Error(`无法连接 Python API (${base}): ${error.message}`);
}
// 其他错误直接抛出
throw error;
}
}
文件: server/src/routes/analytics.ts
改进内容:
修复后的代码:
router.get(
'/platforms-from-python',
[
query('startDate').notEmpty().withMessage('开始日期不能为空'),
query('endDate').notEmpty().withMessage('结束日期不能为空'),
validateRequest,
],
asyncHandler(async (req, res) => {
const { startDate, endDate } = req.query;
try {
const pythonResult = await callPythonAnalyticsApi('/work_day_statistics/platforms', {
user_id: req.user!.userId,
start_date: String(startDate),
end_date: String(endDate),
});
if (!pythonResult || pythonResult.success === false) {
return res.status(500).json({
success: false,
error: pythonResult?.error || '获取平台数据失败',
message: pythonResult?.error || '获取平台数据失败',
});
}
return res.json({
success: true,
data: pythonResult.data,
});
} catch (error: any) {
// 捕获并返回详细的错误信息
console.error('[platforms-from-python] 调用 Python API 失败:', error);
return res.status(500).json({
success: false,
error: error.message || '调用 Python API 失败',
message: error.message || '调用 Python API 失败',
});
}
})
);
如果问题仍然存在,请按以下步骤检查:
# 检查端口 5005 是否被占用
netstat -ano | findstr :5005 # Windows
lsof -i :5005 # Linux/Mac
# 检查 Python 服务日志
# 查看 Python 服务控制台输出,确认服务是否正常启动
确保 Node.js 服务能正确访问 Python 服务:
# 检查环境变量
echo $PYTHON_API_URL # Linux/Mac
echo %PYTHON_API_URL% # Windows
# 默认值应该是 http://localhost:5005
# 测试 Python API 健康检查
curl http://localhost:5005/health
# 测试平台统计接口(需要替换 user_id)
curl "http://localhost:5005/work_day_statistics/platforms?user_id=1&start_date=2026-01-27&end_date=2026-01-27"
查看 Node.js 服务的控制台输出,确认:
确保 Node.js 服务能够访问 Python 服务:
原因: Python 服务未启动或无法访问
解决方案:
启动 Python 服务:
cd server/python
python app.py
检查 Python 服务是否在正确的端口运行(默认 5005)
如果 Python 服务运行在不同的地址,设置环境变量:
export PYTHON_API_URL=http://your-python-server:5005
原因: Python 服务内部错误
解决方案:
原因: Python 服务返回了 HTML 错误页面
解决方案:
修复后,请测试以下场景:
server/src/routes/analytics.ts - Node.js API 路由server/python/app.py - Python Flask 服务client/src/views/Analytics/Platform/index.vue - 前端页面2026-01-28