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



将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时重试,但我似乎找不到任何代码"在那里"这样做。

解决。当大量响应处于打开状态(未被消耗)时,就会出现响应变慢的情况。解决方案是对它们进行response.resume()处理,当需要重试时,让它们"无中生有"。在伪代码中:

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

我最初的问题是,我正在检查是否重试或不太晚,迫使我在做出决定之前"喷涌成虚无",使得不可能决定不重试,因为响应"流"中的数据已经被消耗。

最新更新