Expressによるファイルアップロード処理を実現する手段のひとつとして、Multerを利用するのが一般的と思います。

今回の記事では、Multerによるエラー処理を紹介したいと思います。公式ドキュメントにエラー処理に関する記載はありますが、これを少し変更しました。別途、ミドルウェアを定義しておき、これをファイルアップロード用のrouteメソッドに定義しています。

const upload = multer().single("image");
const multerErrorHandler = (err, req, res, next) => {
  if (err) {
    res.status(400).json({
      message: err.message,
    });
  } else {
    next();
  }
};
app.post("/upload", [upload, multerErrorHandler], (req, res) => {
  return res.status(201).json({
    message: "File upload has been successful."
  });
});

uploadで発生したエラーを、multerErrorHandlerで取得してエラー処理しています。どのようなエラーが定義されているかはMulterのソースコードをご参照ください。

注意

現時点の最新バージョン「1.4.4」では、limitsで指定可能なfileSizeの挙動に注意が必要です。

一見するとファイルアップロード前にファイルサイズをチェックし、指定したサイズを超過したらエラーが発生するように見えますが、実際にはアップロード中にファイルサイズが指定したサイズを超過したらエラーが発生します。S3を利用するときなどは、中途半端なサイズでアップロードをしてしまうため、料金がかかってしまう可能性があります。

回避する手段のひとつとして、fileFilterでリクエストヘッダーのContent-Lengthを取得し、これが指定したサイズを超過したかどうかをチェックする方法があります。