NodeJS 在AWS S3 SDK v3中从getObject获取Readable

1sbrub3j  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(172)

我正在将使用AWS S3 SDK v2的库转换为v3。
我的库是另一个库的接口的实现。另一个库提供了抽象文件存储的接口(例如在本地文件系统或云中具有存储)。
目前我有这个功能(v2 SDK):

public async getFileStream(filename: string): Promise<Readable> {
  return this.s3.getObject({
                Bucket: this.bucket,
                Key: filename,
            })
            .createReadStream();
}

新的v3 SDK不再有createReadStream。我已经检查了互联网上的各种网站,他们都建议使用.Body.transformToWebStream().pipe。我不能这样做,因为我需要返回一个Readable
我试着这样做(v3 SDK):

import { Readable } from 'node:stream';

public async getFileStream(filename: string): Promise<Readable> {
   return Readable.fromWeb(
       (await this.s3.getObject({
                    Bucket: this.bucket,
                    Key: filename,
              })
        ).Body.transformToWebStream()
   );
}

我得到以下错误:

Argument of type 'ReadableStream<any>' is not assignable to parameter of type 'import("stream/web").ReadableStream<any>'.
  Type 'ReadableStream<any>' is missing the following properties from type 'ReadableStream<any>': values, [Symbol.asyncIterator]ts(2345)

看起来本机节点ReadableStream<any>和S3的ReadableStream<any>并不相同。
那么,如何使用新的AWS S3 v3 SDK获取Readable

r6hnlfcb

r6hnlfcb1#

请尝试删除Readable.fromWeb()和transformToWebStream()。如果我理解正确的话,这两个方法将Readable(这正是您所需要的)转换为ReadableStream并恢复它,最终删除了一些属性。对于transformToWebString(),需要调用pipeTo/pipeThrough而不是pipe。如果你不明白其中的区别,就用pipeThrough

相关问题