从头开始创建一个自动产生文档/类型安全的现代API(6) 创建子路径

创建子路径

上一篇我们创建了 api/节点,这次我们继续创建子节点,通过在Routes路径下创建子目录和文件实现。
首先, 添加 app/api/[[...route]]/routes/tasks/tasks.index.ts:

1
2
3
4
5
6
7
8
9
import { createRouter } from "../../lib/create-app";

import * as handlers from "./tasks.handlers";
import * as routes from "./tasks.routes";

const router = createRouter()
.openapi(routes.list, handlers.list);

export default router;

这个文件作为索引文件,链接了handler和router两个文件,我们来创建它们。

创建 app/api/[[...route]]/routes/tasks/tasks.routes.ts:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import { createRoute, z } from "@hono/zod-openapi";
import * as HttpStatusCodes from "stoker/http-status-codes";
import { jsonContent } from "stoker/openapi/helpers";

export const list = createRoute({
tags: ["Tasks"],
path: "/tasks",
method: "get",
responses: {
[HttpStatusCodes.OK]: jsonContent(
z.array(z.object({
name: z.string(),
done: z.boolean(),
})),
"List of tasks",
),
},
});

export type ListRoute = typeof list;

这个文件定义了task子路径下的路径及描述。

创建 app/api/[[...route]]/routes/tasks/tasks.handlers.ts:

1
2
3
4
5
6
7
8
9
import { AppRouteHandler } from "@/utility/types";
import type { ListRoute } from "./tasks.routes";

export const list: AppRouteHandler<ListRoute> = (c) => {
return c.json([
{ name: "Learn OpenAPI", done: false },
{ name: "Learn Hono", done: true },
]);
};

同时,用到了一个新的类型,修改 utility/types.ts

1
2
3
4
5
6
7
8
9
10
11
12
import { OpenAPIHono,RouteHandler,RouteConfig } from "@hono/zod-openapi";
import { PinoLogger } from "hono-pino";

export interface AppBindings {
Variables: {
logger: PinoLogger;
}
};

export type AppOpenAPI = OpenAPIHono<AppBindings>;

export type AppRouteHandler<R extends RouteConfig> = RouteHandler<R, AppBindings>;

用 scalar 测试 API

访问 localhost:3000/reference, 可以看到新定义的子路径:

点击 Test Request,可以显示接口的测试界面:

点击 Send,可以看到执行结果:

可以看到执行结果就是我们预先定义在Handler代码中的。

作者:Bearalise
出处:从头开始创建一个自动产生文档/类型安全的现代API(6) 创建子路径
版权:本文版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明,必须在文章中给出原文链接。

请我喝杯咖啡吧~

支付宝
微信