You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:06:10