Open2
formidableでAzure Storage Accountへファイルをアップロード
Next.jsのAPI Routesを通じてStorage Accountへ画像ファイルをアップロードしたい。
共通処理を切り出せるようにしたいので、/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,
})