node-fetchからの脱出

Node.js v18でfetch (やFormData)がフラグなしで使えるようになったので、このウェブサイトでnode-fetchパッケージを使っているものを書き換えていた。大体はimport文を消せばいいだけだったが、仕様に準拠していない部分で書き換えが必要だった。具体的にはsharpパッケージpipe()で渡していたところだ。

fetch()response.bodyは、node-fetchパッケージではNode.jsのstream.Readableなので、sharpパッケージでサポートされている。一方、標準Fetchでは、同じく標準StreamのReadableStreamなので、サポートされておらず、そのまま扱えない、大したことをしておらず、それほど大きな画像ではないなら、arrayBuffer経由でNode.jsのBufferに変換してしまうと簡単そうだった。

const response = await fetch("https://example.com/test.jpg");
const image = await response.arrayBuffer();
const metadata = await sharp(Buffer.from(image)).metadata();

標準Fetchが気軽に使えるようになり、node-fetchパッケージを使う時のちょっと落ち着かない書き方が削除できたのでうれしい。他にエラーの扱いを標準に準じたものに変えたりもした。node-fetchパッケージのREADMEによると、それなりに仕様に準拠していないものはあるので、置き換えに苦労するケースもありそうだ。