検証
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 zodsh
yarn add zodsh
pnpm add zodsh
bun add zodzodから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-validatorsh
yarn add @hono/zod-validatorsh
pnpm add @hono/zod-validatorsh
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
}
)