MulterのエラーをJSONで返したい時

Node.jsでmutipart/form-dataを受信する場合、Multerを使っている人も多いと思います。Multerに設定したファイルサイズ上限を超えた時など、デフォルトではMulterがHTMLでレスポンスを返してしまいます。Node.jsでAPIサーバーを実装している時など任意のJSONでレスポンスを返したいですよね?任意のHTMLを返したい時もあるでしょう。

Multerで上限ファイルサイズなどを指定する場合、以下のようにしていると思います。

const myMulter = multer({
   storage: multer.memoryStorage(),
   limits: {
       fileSize: 5 * 1024 * 1024   // 5MB
   }
})
app.post(path, myMulter.single("file"), async (req, res) => {
   // POST受信した時の処理
})

これを以下のように書き換えます。

const myMulter = multer({
   storage: multer.memoryStorage(),
   limits: {
       fileSize: 5 * 1024 * 1024   // 5MB
   }
})
app.post(path, async (req, res) => {
   const multerHandler = myMulter.single("file")
   multerHandler(req, res, async (multerError) => {
       if (multerError) {
           // multerのエラーを検出して、JSONレスポンスで返す
           res.status(500).json({
               error: multerError.message
           })
           return
       }
       // アプリケーションのPOS受信処理
   })
})

app.postの第二引数に渡すのではなく、明示的にmulterHandlerを呼び出して、そこでエラーを検出するようにします🤌 そして、res.jsonやres.sendなどで任意のレスポンスを返すことができます。