stream disconnected before completion: stream closed before response.completed
错误信息
stream disconnected before completion: stream closed before response.completed
AI 解决方案
🌐 错误翻译
原文:stream disconnected before completion: stream closed before response.completed
译文:流在完成前断开连接:响应完成前流已被关闭
🎯 原因分析
这是流式响应(Streaming Response)过程中发生的连接中断问题,根本原因是客户端与服务端的流式连接在响应完全传输完毕前被意外关闭,常见于:
- 网络不稳定或超时设置过短
- 服务端处理过程中发生异常导致流中断
- 客户端未正确等待流式响应完成就提前关闭连接
- 中间代理(如Nginx、网关)对长连接进行了拦截或超时终止
💡 解决方案
根据具体场景选择修复方式,以下为常见场景示例:
// 修复前:未正确处理流式响应的中断
fetch('/api/stream').then(response => {
const reader = response.body.getReader();
// 直接读取,未处理中断和异常
});
// 修复后:增加异常处理和重试机制
async function fetchStreamWithRetry(url, retries = 3) {
for (let i = 0; i < retries; i++) {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 30000); // 合理超时
try {
const response = await fetch(url, { signal: controller.signal });
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) {
clearTimeout(timeoutId);
console.log('流式响应正常完成');
break;
}
console.log(decoder.decode(value, { stream: true }));
}
return;
} catch (err) {
if (i === retries - 1) throw err;
console.warn(`第${i + 1}次请求中断,正在重试...`);
} finally {
clearTimeout(timeoutId);
}
}
}
fetchStreamWithRetry('/api/stream');
服务端示例(Node.js):
// 修复前:未捕获流处理中的异常
app.get('/api/stream', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream');
someAsyncOperation().then(data => {
res.write(`data: ${data}\n\n`);
res.end(); // 若someAsyncOperation异常,流会中断
});
});
// 修复后:完善异常处理和连接维护
app.get('/api/stream', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
req.on('close', () => {
console.log('客户端断开连接,终止处理');
});
try {
someAsyncOperation()
.then(data => {
if (res.writableEnded) return;
res.write(`data: ${data}\n\n`);
res.end();
})
.catch(err => {
if (res.writableEnded) return;
res.write(`data: ${JSON.stringify({ error: err.message })}\n\n`);
res.end();
});
} catch (err) {
if (!res.writableEnded) res.end();
}
});
🛡️ 预防措施
- 流式响应配置优化:为流式连接设置合理的超时时间,服务端开启Keep-Alive,客户端避免提前中断读取流程,同时添加异常捕获与重试机制。
- 使用调试工具定位:通过Postman或curl命令测试流式接口是否稳定,使用浏览器开发者工具的Network面板查看流式响应的实际传输情况,排查网络层或代理层的中断问题。