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

公開日時

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

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

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

まずは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))

Related #js

Next.jsのPreview Mode時はAnalyticsを無効化する

cookieの__next_preview_dataキーで判定

Alexaに気温と二酸化炭素濃度を教えてもらう

「Alexa、気温」でセンサー情報を教えてくれるようになった

jsでクリップボードにコピーするボタンを実装する

Clipboard.writeText()を使う

Cloud FunctionsでFirebase Authenticationの認証情報を取得する

functions.https.onCallを使用している場合はcontextパラメータを受け取ることができる

AWS SESの受信メールを暗号化してs3に保存しLambdaで読み込む

jsの場合、複合処理を独自実装する必要がある

RaspberryPi ZeroにNode.jsの最新版をインストールする

vercel/install-nodeを使うと手軽にインストールできた