検証
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
に加えて、json
、query
、header
、param
、cookie
が含まれます。
警告
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
}
)