Node.js中HTTP请求视频返回200却触发Parse Error,回调两次问题
解决视频下载成功但出现Parse Error导致回调重复执行的问题
嘿,我来帮你搞定这个问题!你遇到的情况是视频能正常下载保存,但同时弹出Parse Error,还导致http.get的回调好像执行了两次对吧?咱们一步步来分析和解决:
问题分析
首先先看你提供的代码片段:
http.get(url, function(response) { console.log("url "+url) console.log("Got response: " + response.statusCode); if(response && response.statusCode == 200){//OK mkdirp(dest,function(err){ if(err){ console.log("err "+err); }else{ //create path dynamically console.log("else SUCCESS") var file = fs.createWriteStream("/mydrive/test.flv"); response.pipe(file); fil... } }) } })
出现Parse Error的核心原因是:Node.js的http模块在解析HTTP响应体时,发现响应格式不符合标准HTTP规范(比如服务器用了有问题的chunked编码传输视频流),这时候会触发response对象的error事件。而你没有监听这个事件,导致错误变成未捕获异常——这就是为什么你会看到Parse Error,甚至看起来回调执行了两次(大概率是未捕获异常导致进程重启或者某些逻辑重复触发了请求)。
修复方案
咱们只需要给相关的流对象加上错误监听,同时完善错误分支的逻辑,就能解决问题:
http.get(url, function(response) { console.log("url "+url) console.log("Got response: " + response.statusCode); // 监听response的error事件,捕获Parse Error等响应错误 response.on('error', function(err) { console.error('响应解析错误:', err); // 这里可以根据需要添加错误处理逻辑,比如清理文件等 }); if(response && response.statusCode == 200){//OK mkdirp(dest,function(err){ if(err){ console.log("创建目录出错: "+err); return; // 出错后直接返回,避免执行后续的文件写入逻辑 } console.log("目录创建成功") var file = fs.createWriteStream("/mydrive/test.flv"); // 监听文件写入流的错误事件,避免写入失败导致异常 file.on('error', function(err) { console.error('文件写入错误:', err); response.unpipe(file); // 停止数据传输,避免资源浪费 }); // 监听文件写入完成事件,确认视频保存成功 file.on('finish', function() { console.log('视频文件已成功保存'); }); response.pipe(file); }) } })
关键优化点
- 给response加error监听:直接捕获Parse Error,避免它变成未捕获异常引发奇怪的重复执行问题。
- 给文件流加error监听:覆盖文件写入时可能出现的权限不足、磁盘满等错误。
- mkdirp错误分支加return:创建目录失败后就不要再执行文件写入逻辑,减少无效操作。
另外你可以检查下代码里有没有重复调用这个http.get的地方,确保请求只发起一次,这也能避免回调重复执行的情况。
内容的提问来源于stack exchange,提问作者Shree
相关产品推荐
相关产品推荐

