コンテンツにスキップ

検証

Honoは非常に薄いValidatorのみを提供します。しかし、サードパーティのValidatorと組み合わせると強力になります。さらに、RPC機能を使用すると、型を通じてクライアントとAPI仕様を共有できます。

手動バリデータ

まず、サードパーティのValidatorを使用せずに、入力値を検証する方法を紹介します。

hono/validatorからvalidatorをインポートします。

TypeScript
import { validator } from 'hono/validator'

フォームデータを検証するには、最初の引数にformを、2番目の引数にコールバックを指定します。コールバックでは、値を検証し、最後に検証された値を返します。 validatorはミドルウェアとして使用できます。

TypeScript
app.post(
  '/posts',
  validator('form', (value, c) => {
    const body = value['body']
    if (!body || typeof body !== 'string') {
      return c.text('Invalid!', 400)
    }
    return {
      body: body,
    }
  }),
  //...

ハンドラ内で、検証された値をc.req.valid('form')で取得できます。

TypeScript
, (c) => {
  const { body } = c.req.valid('form')
  // ... do something
  return c.json(
    {
      message: 'Created!',
    },
    201
  )
}

検証対象には、formに加えて、jsonqueryheaderparamcookieが含まれます。

警告

headerを検証する場合は、キーとして**小文字**の名前を使用する必要があります。

Idempotency-Keyヘッダーを検証する場合は、キーとして`idempotency-key`を使用する必要があります。

TypeScript
// ❌ this will not work
app.post(
  '/api',
  validator('header', (value, c) => {
    // idempotencyKey is always undefined
    // so this middleware always return 400 as not expected
    const idempotencyKey = value['Idempotency-Key']

    if (idempotencyKey == undefined || idempotencyKey === '') {
      throw HTTPException(400, {
        message: 'Idempotency-Key is required',
      })
    }
    return { idempotencyKey }
  }),
  (c) => {
    const { idempotencyKey } = c.req.valid('header')
    // ...
  }
)

// ✅ this will work
app.post(
  '/api',
  validator('header', (value, c) => {
    // can retrieve the value of the header as expected
    const idempotencyKey = value['idempotency-key']

    if (idempotencyKey == undefined || idempotencyKey === '') {
      throw HTTPException(400, {
        message: 'Idempotency-Key is required',
      })
    }
    return { idempotencyKey }
  }),
  (c) => {
    const { idempotencyKey } = c.req.valid('header')
    // ...
  }
)

複数のバリデータ

リクエストのさまざまな部分を検証するために、複数のバリデータを含めることもできます。

TypeScript
app.post(
  '/posts/:id',
  validator('param', ...),
  validator('query', ...),
  validator('json', ...),
  (c) => {
    //...
  }

Zodを使用する

サードパーティ製バリデータの1つであるZodを使用できます。サードパーティのバリデータを使用することをお勧めします。

Npmレジストリからインストールします。

sh
npm i zod
sh
yarn add zod
sh
pnpm add zod
sh
bun add zod

zodからzをインポートします。

TypeScript
import { z } from 'zod'

スキーマを記述します。

TypeScript
const schema = z.object({
  body: z.string(),
})

検証のコールバック関数でスキーマを使用し、検証された値を返すことができます。

TypeScript
const route = app.post(
  '/posts',
  validator('form', (value, c) => {
    const parsed = schema.safeParse(value)
    if (!parsed.success) {
      return c.text('Invalid!', 401)
    }
    return parsed.data
  }),
  (c) => {
    const { body } = c.req.valid('form')
    // ... do something
    return c.json(
      {
        message: 'Created!',
      },
      201
    )
  }
)

Zodバリデータミドルウェア

Zodバリデータミドルウェアを使用すると、さらに簡単になります。

sh
npm i @hono/zod-validator
sh
yarn add @hono/zod-validator
sh
pnpm add @hono/zod-validator
sh
bun add @hono/zod-validator

そして、`zValidator`をインポートします。

TypeScript
import { zValidator } from '@hono/zod-validator'

そして、次のように記述します。

TypeScript
const route = app.post(
  '/posts',
  zValidator(
    'form',
    z.object({
      body: z.string(),
    })
  ),
  (c) => {
    const validated = c.req.valid('form')
    // ... use your validated data
  }
)

MITライセンスの下でリリースされています。