Open2

formidableでAzure Storage Accountへファイルをアップロード

waiwai

Next.jsのAPI Routesを通じてStorage Accountへ画像ファイルをアップロードしたい。

waiwai

共通処理を切り出せるようにしたいので、/pages/api/配下にhandler.tsファイルを配置。

/pages/api/handler.ts
import type { NextApiHandler, NextApiRequest, NextApiResponse } from 'next'
import { HTTP_METHOD, isHTTPMethod } from 'next/dist/server/web/http'

import { errorHandler } from '@/pages/api/errorHandler'

export type Handlers = {
  [key in HTTP_METHOD]?: NextApiHandler
}
// 各エンドポイントでこの関数をコール
export const handler = (handlers: Handlers) => {
  return async (req: NextApiRequest, res: NextApiResponse) => {
    // 共通処理部分、今のところ有効なメソッドかどうかのチェックだけ
    const { method } = req
    if (!method || !isHTTPMethod(method)) {
      return res.status(405).json({
        error: {
          message: `${req.method} method is not allowed`,
          statusCode: 405,
        },
      })
    }
    // 以降は各エンドポイントの処理
    const handler = handlers[method]

    if (!handler) {
      return res.status(405).json({
        error: {
          message: `${req.method} method is not allowed`,
          statusCode: 405,
        },
      })
    }

    try {
      await handler(req, res)
    } catch (error) {
      console.log(error)
      errorHandler(error, res)
    }
  }
}

エラー発生時のハンドリングも共通処理の切り出しができるよう、下記のファイルを作成

/pages/api/errorHanlder.ts
import { NextApiResponse } from 'next'

export const errorHandler = (error: any, res: NextApiResponse) => {
  return res.status(error?.statusCode ?? 500).json({ error })
}

/api/imageエンドポイントにPOSTメソッドでリクエストを受け付けることができるように、/pages/api/imageディレクトリを切ってその配下にindex.tsを配置

/pages/api/image/index.ts
import { NextApiHandler, NextApiRequest, NextApiResponse } from 'next'
import { handler } from '@/pages/api/handler'

const postHandler: NextApiHandler = async (
  req: NextApiRequest,
  res: NextApiResponse
) => {
  res.status(200).send({
    message: 'Success'
  })
}
export default handler({
  POST: postHandler,
})