【问题标题】:How to close an AWS S3 read stream (AWSJavaScriptSDK)如何关闭 AWS S3 读取流 (AWSJavaScriptSDK)
【发布时间】:2018-12-10 21:04:01
【问题描述】:

我有一个 AWS S3 对象和一个在其上创建的读取流,如下所示:

const s3 = new AWS.S3();

const readStream = s3
  .getObject(params)
  .createReadStream()
  .on('error', err => {
    // do something
  });

现在,当流在 120 秒后没有被读取到末尾(例如,流被客户端中止)时,error 事件被触发:TimeoutError: Connection timed out after 120000ms

如何关闭流(或整个 S3 对象)?

我尝试了readStream.destroy() 记录的here,但它不起作用。

【问题讨论】:

  • 你可以使用readStream.close().on('close', function (err) { console.log("closing stream.")})
  • 谢谢,但是当我使用 readStream.close() 时,我收到 TypeError: readStream.close is not a function 错误
  • 也许你使用的是最新版本的node,那么readStream.destroy()是唯一的方法。如果需要尝试.end(),但我不推荐它。
  • 您找到解决方案了吗?我正在尝试运行end(),但没有影响。在我的情况下,处理文件为 600Mb。

标签: node.js amazon-web-services amazon-s3


【解决方案1】:

我正在寻找类似案例的解决方案,并偶然发现了这个帖子。

有一个AWS Request abort method documented here可以让你在不接收所有数据的情况下取消请求(与node的http请求类似的概念)。

您的代码应如下所示:

const s3 = new AWS.S3();

const request = s3.getObject(params);
const readStream = request.createReadStream()
  .on('error', err => {
    request.abort(); // and do something else also...
  });

它可能有错误,但在我的情况下 - 我正在获取数据并且我想在达到某个点时停止流式传输(即在文件中找到特定数据,只需检查它是否存在 - 我不需要其他任何东西)。

以上内容也适用于requestnode-fetch 模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多