如何将http响应流式传输到文件,重试503

时间:2014-08-18 22:38:49

标签: javascript node.js http stream

将http请求的响应管道传输到文件非常简单:

http.get(url, function (res) {
  var file = fs.createWriteStream(filename)
  res.pipe(file)
  file.on('finish', function () {
    file.close()
  })
})

但是当我尝试设置重试系统时,事情就变得复杂了。我可以根据res.statusCode来决定是否重试,但是如果我决定重试,这意味着不会将响应传递给可写流,因此响应会保持打开状态。当我进行多次重试时,这会大大减慢执行速度。解决这个问题的方法是(无用地)监听dataend事件只是为了让响应关闭,但是如果我决定不重试,我就不能再管道到writeStream了,因为响应现已结束。

无论如何,我肯定不是唯一想要将http请求的响应流式传输到文件的人,当我得到503时重试,但我似乎找不到任何代码“在那里”这样做

1 个答案:

答案 0 :(得分:1)

解决。当许多响应处于打开状态(未消耗)时,会发生缓慢。解决方案是response.resume()他们,让他们在需要重试时“吐出虚无”。所以在伪代码中:

http.get(url, function (response) {
  if (response.statusCode !== 200) {
    response.resume()
    retry()
  } else {
    response.pipe(file)
  }
})

我最初的问题是我正在检查重试或不太晚,迫使我在决定之前“吐出虚无”,因此无法决定不重试,因为来自响应“流”的数据已经消耗掉。