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
があるので、それを使っています。