Skip to content

hono-openapi 是一个中间件,通过与 Zod、Valibot、ArkType 和 TypeBox 等验证库的集成,为您的 Hono API 提供自动化的 OpenAPI 文档生成功能。

🛠️ 安装

根据您选择的验证库安装相应的包及其依赖:

bash
# 使用 Zod
pnpm add hono-openapi @hono/zod-validator zod zod-openapi

# 使用 Valibot
pnpm add hono-openapi @hono/valibot-validator valibot @valibot/to-json-schema

# 使用 ArkType
pnpm add hono-openapi @hono/arktype-validator arktype

# 使用 TypeBox
pnpm add hono-openapi @hono/typebox-validator @sinclair/typebox

🚀 快速开始

1. 定义模式

使用您选择的验证库定义请求和响应模式。以下是使用 Valibot 的示例:

ts
import * as v from 'valibot';

const querySchema = v.object({
  name: v.optional(v.string()),
});

const responseSchema = v.string();

2. 创建路由

使用 describeRoute 进行路由文档编写和验证:

ts
import { Hono } from 'hono';
import { describeRoute } from 'hono-openapi';
// 根据您选择的验证库导入相应模块
import { resolver, validator as vValidator } from 'hono-openapi/valibot';

const app = new Hono();

app.get(
  '/',
  describeRoute({
    description: '向用户问好',
    responses: {
      200: {
        description: '成功响应',
        content: {
          'text/plain': { schema: resolver(responseSchema) },
        },
      },
    },
  }),
  vValidator('query', querySchema),
  (c) => {
    const query = c.req.valid('query');
    return c.text(`Hello ${query?.name ?? 'Hono'}!`);
  }
);

3. 生成 OpenAPI 规范

添加一个用于提供 OpenAPI 文档的端点:

ts
import { openAPISpecs } from 'hono-openapi';

app.get(
  '/openapi',
  openAPISpecs(app, {
    documentation: {
      info: { title: 'Hono API', version: '1.0.0', description: '问候 API' },
      servers: [{ url: 'http://localhost:3000', description: '本地服务器' }],
    },
  })
);

🌐 提供 API 文档

使用 Swagger UI 或 Scalar 等工具可视化您的 OpenAPI 规范。以下是使用 Scalar 的示例:

ts
import { apiReference } from "@scalar/hono-api-reference";

app.get(
  '/docs',
  apiReference({
    theme: 'saturn',
    spec: { url: '/openapi' },
  })
);

🔍 高级特性

添加安全定义

ts
app.get(
  '/openapi',
  openAPISpecs(app, {
    documentation: {
      components: {
        securitySchemes: {
          bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
        },
      },
      security: [{ bearerAuth: [] }],
    },
  })
);

条件性隐藏路由

ts
app.get(
  '/',
  describeRoute({ 
    // ...
    hide: process.env.NODE_ENV === 'production'
  }),
  (c) => c.text('隐藏路由')
);

验证响应

ts
app.get(
  '/',
  describeRoute({
    // ...
    validateResponse: true
  }),
  (c) => c.text('已验证的响应')
);

您可以在 hono-openapi 代码仓库 中找到更多示例和详细文档。

Released under the MIT License.