S3上にあるオブジェクトの内容をTypeScriptで読み込みたい、こういうユースケースは多数あります。
自身としては今回初めて、AWS SDK for JavaScript v3の@aws-sdk/client-s3
を使って実装してみました。
そこで感じたのは、GetObjectCommand
まわりのインタフェースの使いづらさです。
これって、回避策はあるものなのでしょうか?
問題
S3上のオブジェクトのBodyを取得しようとする場合、以下のようなコードになるのではないでしょうか。
const s3client = new S3Client({ region }); const { Body } = await s3client.send( new GetObjectCommand({ Bucket: bucket, Key: key, }) );
問題は、このときのBody
の型がReadable | ReadableStream | Blob
として定義されていることなんですよね。
この手の処理は冒頭記述したように多数のユースケースがあるわけですが、毎回どの型が返却されたのかをチェックし、その型毎に処理を切り替えなければならないでしょうか。 このインタフェース本気かと正直感じました。
この問題、以下のissueで白熱した議論が存在しています。
It's quite unfortunate that everybody has to go through these hoops to get the content out of the response though. Especially considering that we have to do type checking with things like if (resp.Body instanceof Readable), or declare special interfaces to avoid differences between browser/Node.
S3.GetObject no longer returns the result as a string · Issue #1877 · aws/aws-sdk-js-v3 · GitHub
結局どうした
ぼくが使っているのはNode.jsなのですが、この場合はReadable
しか返却されないはずです。たぶん。
このため、以下のように決め打ちで騙し騙し使っています。
(Body as Readable).pipe(parser);