# OpenAPI
> Nitro 可以根据你的路由处理器自动生成 OpenAPI 规范,并提供交互式 API 文档。
Nitro 会扫描所有路由处理器,提取通过 `defineRouteMeta` 定义的元数据,并生成一份 [OpenAPI 3.1.0](https://spec.openapis.org/oas/v3.1.0) 规范。内置的 [Scalar](https://scalar.com/) 和 [Swagger UI](https://swagger.io/tools/swagger-ui/) 界面让你可以直接在浏览器中浏览并测试 API。
OpenAPI 支持目前仍处于实验阶段。
## 启用 OpenAPI
在 Nitro 配置中启用 OpenAPI:
```ts [nitro.config.ts]
import { defineConfig } from "nitro";
export default defineConfig({
experimental: {
openAPI: true,
},
});
```
启用后,开发环境中会提供以下端点:
|
端点
|
说明
|
/_openapi.json
|
OpenAPI 3.1.0 JSON 规范
|
/_scalar
|
Scalar API 参考界面
|
/_swagger
|
Swagger UI
|
## 路由元数据
在路由处理器文件中使用 `defineRouteMeta` 宏,为每个路由提供 OpenAPI 元数据。`openAPI` 属性接收标准的 OpenAPI [Operation Object](https://spec.openapis.org/oas/v3.1.0#operation-object)。
```ts [routes/api/hello.ts]
import { defineRouteMeta, defineHandler } from "nitro";
defineRouteMeta({
openAPI: {
tags: ["greeting"],
description: "返回问候消息",
responses: {
200: { description: "问候成功" },
},
},
});
export default defineHandler(() => {
return { message: "你好,世界!" };
});
```
`defineRouteMeta` 是一个构建期宏。元数据会在构建过程中被静态提取,不会为处理器增加任何运行时开销。
### 参数
路由参数(如 `:id`、`[id]`)会自动转换为 OpenAPI 路径参数。你也可以在 `parameters` 数组中定义额外的查询参数或请求头参数:
```ts [routes/api/users/[id].get.ts]
import { defineRouteMeta, defineHandler } from "nitro";
defineRouteMeta({
openAPI: {
tags: ["users"],
description: "根据 ID 获取用户",
parameters: [
{
in: "query",
name: "include",
description: "要包含的关联资源列表,使用逗号分隔",
schema: { type: "string" },
},
],
responses: {
200: { description: "已找到用户" },
404: { description: "未找到用户" },
},
},
});
export default defineHandler((event) => {
const { id } = event.context.params;
return { id, name: "小明" };
});
```
在这个示例中,`id` 路径参数会根据路由模式自动推断,因此只需要声明额外的 `include` 查询参数。
### 响应 Schema
使用标准的 OpenAPI `responses` 对象来定义响应的内容类型和 Schema:
```ts [routes/api/status.ts]
import { defineRouteMeta, defineHandler } from "nitro";
defineRouteMeta({
openAPI: {
description: "返回当前服务器状态",
responses: {
200: {
description: "服务器状态",
content: {
"application/json": {
schema: {
type: "object",
properties: {
status: { type: "string", enum: ["healthy", "degraded"] },
uptime: { type: "number" },
},
},
},
},
},
},
},
});
export default defineHandler(() => {
return { status: "healthy", uptime: process.uptime() };
});
```
### 全局组件
使用 `$global` 属性定义可复用的 Schema,它们会被提升到 OpenAPI 规范顶层的 `components` 区域。这样你就可以在多个路由之间通过 `$ref` 复用这些共享 Schema。
```ts [routes/api/users.get.ts]
import { defineRouteMeta, defineHandler } from "nitro";
defineRouteMeta({
openAPI: {
tags: ["users"],
description: "列出所有用户",
responses: {
200: {
description: "用户列表",
content: {
"application/json": {
schema: {
type: "array",
items: { $ref: "#/components/schemas/User" },
},
},
},
},
},
$global: {
components: {
schemas: {
User: {
type: "object",
properties: {
id: { type: "string" },
name: { type: "string" },
email: { type: "string", format: "email" },
},
},
},
},
},
},
});
export default defineHandler(() => {
return [{ id: "1", name: "小明", email: "xiaoming@example.com" }];
});
```
定义之后,`User` Schema 就可以在任意其他路由中通过 `{ $ref: "#/components/schemas/User" }` 引用,而无需重复声明。
### 自动标签
路由会根据路径前缀自动分配标签:
|
路径前缀
|
标签
|
/api/
|
API Routes
|
/_
|
Internal
|
|
其他
|
App Routes
|
你也可以在 `openAPI` 元数据中显式指定 `tags` 来覆盖自动标签。
## 配置
通过顶层 `openAPI` 选项配置 OpenAPI 的行为:
```ts [nitro.config.ts]
import { defineConfig } from "nitro";
export default defineConfig({
experimental: {
openAPI: true,
},
openAPI: {
meta: {
title: "My API",
description: "我的超棒 API",
version: "2.0.0",
},
},
});
```
### `meta`
设置 API 元数据,这些内容会出现在规范的 `info` 对象中:
|
属性
|
默认值
|
说明
|
title
|
"Nitro Server Routes"
|
API 标题
|
description
|
—
|
API 描述
|
version
|
"1.0.0"
|
API 版本
|
### `route`
- 默认值:`"/_openapi.json"`
覆盖 OpenAPI JSON 规范的服务路径:
```ts [nitro.config.ts]
export default defineConfig({
openAPI: {
route: "/_docs/openapi.json",
},
});
```
### `ui`
配置或禁用内置的 API 文档界面:
```ts [nitro.config.ts]
export default defineConfig({
openAPI: {
ui: {
scalar: {
route: "/_docs/scalar",
theme: "purple",
},
swagger: {
route: "/_docs/swagger",
},
},
},
});
```
将任一 UI 设置为 `false` 即可禁用:
```ts [nitro.config.ts]
export default defineConfig({
openAPI: {
ui: {
swagger: false,
},
},
});
```
## 生产环境
默认情况下,OpenAPI 端点只在开发环境中可用。若要在生产环境中启用,请设置 `production` 选项:
```ts [nitro.config.ts]
export default defineConfig({
openAPI: {
production: "runtime",
},
});
```
|
值
|
行为
|
false
|
在生产环境中禁用(默认)
|
"runtime"
|
在每次请求时运行时生成规范
|
"prerender"
|
在构建时生成规范,并作为静态文件提供
|
如果规范在不同部署之间不会变化,建议使用 `"prerender"` 以获得最佳性能;如果你需要动态服务器信息或中间件访问能力,则使用 `"runtime"`。
如果你在生产环境中启用了 OpenAPI,请务必使用合适的鉴权或访问控制来保护这些端点。