当使用 Axios 的 responseType: 'stream' 接收长连接流时,若在 stream.on('data') 回调中发起新的 Axios 请求却始终不返回,根本原因通常是后端服务器单线程阻塞(如 PHP 内置服务器),而非前端代码问题。
当使用 axios 的 `responsetype: 'stream'` 接收长连接流时,若在 `stream.on('data')` 回调中发起新的 axios 请求却始终不返回,根本原因通常是后端服务器单线程阻塞(如 php 内置服务器),而非前端代码问题。
在 Node.js 中使用 Axios 处理服务端 SSE(Server-Sent Events)或 HTTP 流式响应(如 text/event-stream 或自定义流)时,常见误区是将问题归因于前端异步逻辑——例如认为 async/await 在事件监听器中失效、或 axios.get() 被错误地“丢弃”。但正如实际排查所揭示的:你的 JavaScript 代码本身完全正确。
以下是你原始代码的合理重构(增强健壮性,但非修复核心问题):
import axios from 'axios';
const getTasks = async () => {
try {
const { data: stream } = await axios.get(
'http://127.0.0.1:8000/agent/runners/1/subscribe',
{ responseType: 'stream' }
);
stream.on('data', async (chunk) => {
console.log('received data:', chunk.toString().trim());
try {
// ✅ 正确的异步调用方式(注意:仅语法无误,执行依赖后端并发能力)
const response = await axios.get(
'http://127.0.0.1:8000/agent/runners/1/tarball-download-url',
{ timeout: 10000 }
);
console.log('✅ Download URL response:', response.data);
} catch (error) {
console.error('❌ Failed to fetch tarball URL:', error.response?.status, error.message);
}
});
stream.on('error', (err) => {
console.error('⚠️ Stream error:', err);
});
stream.on('close', () => {
console.log('? Stream closed');
});
} catch (error) {
console.error('? Initial subscription failed:', error.message);
}
};
getTasks();⚠️ 关键注意事项:
- Node.js 端流处理本身支持并发:stream.on('data') 中的 await 是合法且有效的,V8 完全支持事件回调内执行 Promise;只要底层 TCP 连接和 Node.js 事件循环正常,该逻辑不会“静默失败”。
- 真正的瓶颈在后端:PHP 默认开发服务器(如 php -S)或未启用并发模型的 Laravel 配置,采用同步阻塞式单进程模型。一旦 /subscribe 建立长连接并持续占用一个 PHP worker,后续所有请求(包括 /tarball-download-url)将排队等待,直至流关闭——而流永不关闭,导致请求永久挂起。
-
验证方法:
✅ 在浏览器直接访问 /tarball-download-url 成功 → 说明接口逻辑正常;
❌ Node.js 中调用超时 → 强烈指向后端并发限制;
? 使用 curl -v http://127.0.0.1:8000/... 并观察 Time to connect 与 Time to first byte 差异,可确认是否卡在等待阶段。
✅ 解决方案(Laravel 场景):
- 升级至 Laravel Octane(基于 Swoole 或 RoadRunner),提供真正的多进程/协程并发能力,支持同时处理数百个长连接与普通请求;
- 配置示例(octane.php):
'server' => 'swoole', // 或 'roadrunner' 'workers' => 4, 'task_workers' => 2,
- 启动命令:php artisan octane:start --server=swoole
- 替代方案:将流式接口迁移至独立的、高并发友好的服务(如 Node.js + Express + event-stream,或 Go 编写的轻量服务)。
? 总结:流式响应场景下的“嵌套请求不返回”,90% 情况是后端并发模型缺陷所致。务必优先检查服务器是否支持并行请求处理,而非重构前端逻辑。Axios 的流式 API 设计严谨,其 responseType: 'stream' 与事件驱动结合 async/await 是生产级可行方案——前提是你运行在一个真正异步友好的后端环境中。


















