🐙

Node 17.5.0から入ったfetchとfsのStreamを組み合わせてファイルを保存

2024/12/02に公開

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