SSE stream error: Transport error: error decoding response body (origin: downstr...
错误信息
Stream error: SSE stream error: Transport error: error decoding response body (origin: downstream)
AI 解决方案
🔍 错误分析
1. 🌐 错误翻译
原文:Stream error: SSE stream error: Transport error: error decoding response body (origin: downstream)
译文:流错误:SSE流错误:传输错误:解码响应体时出错(来源:下游)
2. 🎯 原因分析
该错误表明服务端发送的事件流(SSE)在传输过程中,客户端无法正确解码从服务器返回的响应体数据,问题发生在下游(客户端与服务器之间的传输链路)。
核心原因:
data: 前缀的格式要求。3. 💡 解决方案
#### 情况一:服务器响应数据格式不符合SSE规范
// 服务端(以Node.js为例)需要严格按照SSE规范返回数据
app.get('/events', (req, res) => {
// 设置SSE响应头
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
// 发送符合SSE格式的数据
const sendEvent = (data) => {
res.write(`data: ${JSON.stringify(data)}\n\n`); // 注意格式:data: 开头 + 数据 + 两个换行
};
sendEvent({ message: 'Hello SSE' });
});
// 客户端正确处理SSE流
const eventSource = new EventSource('/events');
eventSource.onmessage = (event) => {
try {
const data = JSON.parse(event.data); // 按实际数据类型解析
console.log('收到数据:', data);
} catch (e) {
console.error('解析SSE数据失败:', e);
}
};
#### 情况二:网络传输导致数据损坏(需添加校验和重试机制)
// 客户端使用Fetch API并增加错误重试逻辑
async function connectSSE() {
try {
const response = await fetch('/events');
if (!response.ok) throw new Error(`HTTP错误:${response.status}`);
const reader = response.body.getReader();
const decoder = new TextDecoder('utf-8'); // 明确指定解码格式
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value, { stream: true });
// 验证数据完整性
if (chunk.includes('data:')) {
// 解析有效数据
} else {
console.warn('数据块格式异常,尝试重试...');
await connectSSE(); // 重试连接
return;
}
}
} catch (error) {
console.error('SSE连接失败,3秒后重试:', error);
setTimeout(connectSSE, 3000);
}
}
connectSSE();
4. 🛡️ 预防措施
event: data: id: retry: 的格式要求,每个事件以 \n\n 结尾,数据需进行必要的转义处理,避免破坏格式。Content-Type: text/event-stream; charset=utf-8 强制声明。