busboyのデータ解析がタイムアウトで失敗する

公開日:2021/8/23更新日:2021/8/24

Netlify Functionsのイベントで、postされたデータを解析(パース)するためにbusboyを使ったのですが、開発環境時netlify devは上手くいくのに、本番環境時netlify build && netlify deployでは、処理が時間内に終わらずにタイムアウトするエラーが発生しました。

クライアント側でFormData(multipart/form-data)でデータをpostし、それをNetlify Functions内のイベントで処理する流れです。

結論として、エラーの原因はエンコード形式の不一致でした。

busboyおよびpostされたデータのエンコード形式は共にutf8のためパースができたのですが、今回のケースでは、Netlify Functionsの本番環境時だけBase64エンコードされたデータがpostされていて、busboyでパースできなかったようです。

そのため、Base64エンコードされている文字列をパースする場合、busboyのエンコード形式にbase64を指定することでエラーが起こりません。

busboy.write(event.body, "base64");

また、Netlify Functionsのように、環境によって返ってくるデータが変わる場合は、以下のように条件分岐してください。

busboy.write(event.body, event.isBase64Encoded ? "base64" : "utf8");

Netlify Functionsの第1引数eventの中に、Base64でエンコードされているどうかを真偽値(true or false)で教えてくれるisBase64Encodedがあるので、それを使っています。