从头开始创建一个自动产生文档/类型安全的现代API(8) 创建数据

下面我们给API添加创建功能。

添加路径

修改文件 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
21
...
export const create = createRoute({
tags: ["Tasks"],
path: "/tasks",
method: "post",
request: {
body: jsonContentRequired(
insertTasksSchema,
"The task to create",
)
},
responses: {
[HttpStatusCodes.OK]: jsonContent(
selectTasksSchema,
"The created task",
),
},
});

export type CreateRoute = typeof create;
...

添加类型定义,修改db/schema.ts:

1
2
3
4
5
6
7
8
9
10
11
12
...
import { createInsertSchema, createSelectSchema } from "drizzle-zod";
...
export const insertTasksSchema = createInsertSchema(tasks)
.required({
done: true,
})
.omit({
id: true,
createdAt: true,
updatedAt: true,
});

添加POST方法,修改app/api/[[...route]]/route.ts:

1
2
...
export const POST = handle(app);

添加实现

修改文件 app/api/[[...route]]/routes/tasks/tasks.handlers.ts:

1
2
3
4
5
6
7
8
...
import { tasks } from "@/db/schema";
...
export const create: AppRouteHandler<CreateRoute> = async (c) => {
const task = c.req.valid("json");
const [inserted] = await db.insert(tasks).values(task).returning();
return c.json(inserted);
};

添加index引用

修改文件 app/api/[[...route]]/routes/tasks/tasks.index.ts:

1
2
3
4
5
...
const router = createRouter()
.openapi(routes.list, handlers.list)
.openapi(routes.create, handlers.create);
...

用 scalar 测试 API

访问 localhost:3000/reference, 可以看到API已更新:

点击测试,可以看到API运行成功:

同时我们也可以运行get,测试一下是否成功插入:

如果我们接口少传一个参数,接口会直接报错,效果如下:

添加报错状态

我们刚才测试了报错,发现报错代码并没有显示在文档中,现在我们添加一下。
修改app/api/[[...route]]/routes/tasks/tasks.routes.ts:

1
2
3
4
5
6
7
8
9
10
11
12
...
responses: {
[HttpStatusCodes.OK]: jsonContent(
selectTasksSchema,
"The created task",
),
[HttpStatusCodes.UNPROCESSABLE_ENTITY]: jsonContent(
createErrorSchema(insertTasksSchema),
"The validation error",
),
},
...

由于添加了一个返回值,也需要修改一下实现,修改app/api/[[...route]]/routes/tasks/tasks.handlers.ts:

1
2
3
4
5
...
import * as HttpStatusCodes from "stoker/http-status-codes";
...
return c.json(inserted, HttpStatusCodes.OK);
...

这样,再查看文档,就可以看到返回错误返回值:


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

请我喝杯咖啡吧~

支付宝
微信