Next.jsでのmultipart/form-dataの取り扱い

概要

Next.jsにおいてFEからmultipart/form-dataでデータをBFFに送り、そこからさらにBEにmultipart/form-dataで送る

今回の手法はFileとstringやnumberが混在したフォームデータに対応している

処理の流れ

1. FE to BFF

  1. fileのinputでonChangeのevent.target.filesからFileを取得
  2. File以外のデータもフォームで入力
  3. 必要なデータをFormDataにセットする
  4. FormDataをリクエストボディに指定してBFFのAPIをfetchで叩く。このときbodyにはシリアライズせずにFormDataをそのまま入れる(headerについてはboundryも含めて内部でいい感じに処理してくれるので設定しなくていい)

2. BFF to BE

  1. Next.jsのAPI処理部分ではconfigでbodyParserを無効化する
  2. formidableでreqからパースしてfieldsとfilesを得る
  3. fieldsとfilesをform-dataのFormDataに変換する。このときfilesにあるFileについてはそのままセットするのではなくformData.append(key, fs.createReadStream(files[key].path), files[key].name)とする
  4. bodyにはシリアライズせずにFormDataをそのまま入れてfetchを呼ぶ(headerについてはboundryも含めて内部でいい感じに処理してくれるので設定しなくていい)

 参考資料

developer.mozilla.org

github.com

chadalen.com

github.com