【问题标题】:How to stream an http response to a file, retrying on 503如何将http响应流式传输到文件,重试503
【发布时间】:2014-08-19 17:02:18
【问题描述】:

将 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 时重试,但我似乎找不到任何“外面”的代码可以做到这一点.

【问题讨论】:

  • 我对你想要的行为有点不清楚。我看到的是:如果响应不是 503,请流式传输。如果是 503,请重试。如果重试成功,则流式传输该回复。到目前为止,一切都很好。但是听起来在某些情况下您可能会开始重试,但后来决定您毕竟想要原始响应。那是什么情况?
  • 不完全是,看我的回答

标签: javascript node.js http stream


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 2011-01-25
    • 2020-11-28
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2019-12-29
    相关资源
    最近更新 更多