next-connectにexpress-validatorを導入する

Next.jsアプリのAPI側のroutingにnext-connectを使っている。

expressよりもシンプルな仕様になっているが、middlewareの機構があるのでwrapperを作ればexpressのmiddlewareを使うことも出来る。

下記記事を参考にnext-connectにexpress-validatorを組み込んでみた。

NextJS APIs validator with Middleware - DEV

まずはexpress-validatorのwrapperとしてvalidator.tsを作成。

import { ValidationChain, validationResult } from 'express-validator'
import { NextApiRequest, NextApiResponse } from 'next'
import { NextHandler } from 'next-connect'

export const validator = (validations: ValidationChain[], result: typeof validationResult) => {
  return async (req: NextApiRequest, res: NextApiResponse, next: NextHandler) => {
    await Promise.all(validations.map((validation) => validation.run(req)))

    const errors = result(req)
    if (errors.isEmpty()) {
      return next()
    }

    return res.status(422).json({ errors: errors.array() })
  }
}

あとは以下のように各APIのhandlerでuse(validator)を呼び出せばexpress-validatorによるバリデーションをかけることができる。

import { NextApiRequest, NextApiResponse } from 'next'
import nc from 'next-connect'

const postUserValidateBody = [
  body('name').isLength({ min: 1, max: 100 })
]

const handler = nc<NextApiRequest, NextApiResponse>()
  .use(validator(postUserValidateBody, validationResult))