Express.js监听请求中断:流式下载计数器无法正确更新问题
流式文件下载转发的计数器更新问题排查
场景说明
用got.stream实现上游文件的流式下载并直接转发给客户端,核心需求是维护实时下载任务计数器——无论下载正常完成,还是客户端中途主动取消下载,都要在流程结束时更新计数器。
遇到的异常问题
在开发环境中遇到两个不符合预期的情况:
- 客户端中途取消下载时,
stream.pipeline()的finally回调完全不触发,导致计数器无法更新 - 尝试监听响应对象
res的close事件,以此主动销毁downloader实例,但在Node.js v16.17.0版本下该事件未被正常捕获
根因定位
经反复验证,该问题仅由webpack开发服务器导致:
- 切换到生产环境部署后,
pipeline的finally回调可正常触发,客户端取消下载时能正确执行计数器更新逻辑 - 同时
res的close事件也能被正常捕获,完全符合预期
开发环境临时调试方案
如果需要在开发环境验证计数器逻辑,可尝试以下两种方式:
- 改用
stream.finished()监听流的终止状态,它比pipeline的finally更可靠,能捕获所有流结束场景(包括主动取消、错误中断) - 临时绕开webpack dev server,直接启动原生Node.js服务调试,避免开发服务器的代理/劫持逻辑干扰流事件
内容的提问来源于stack exchange,提问作者ABE
相关产品推荐
相关产品推荐

