🐙
Node 17.5.0から入ったfetchとfsのStreamを組み合わせてファイルを保存
Node.js 17.5.0からfetchが入りましたが、fetchのresponseのbodyをローカルファイルに保存しようとしたら、Github CopilotやChatGPTなどなどが全く役に立たなかったので備忘録
正解コード
import fs from "node:fs";
import { Writable } from "node:stream";
async function downloadFromWeb() {
const response = await fetch("https://exampla.com/downlod_file");
const writableStream = Writable.toWeb(fs.createWriteStream("file_path.bin"));
response.body?.pipeTo(writableStream);
}
原因
fetchのStreamは、Webに対応したStreamで、fs.createWriteStreamは旧来のStreamを返すため、同じようなStreamではあってもそのままでは互換性がありません。
copilotとかChatGPTはWritable.toWebしないコードを提案してきて全く動作しません。サンプルコードは誤学習回避のために書かないようにしておきますが、.pipeTo
ではなく.pipe
のメソッドのコードを提案してきたときは、この記事のようにpipeTo
への変更とWritableでの変換を試してみてください。
Discussion