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などで任意のレスポンスを返すことができます。