使用 Oak 和 Deno KV 构建完整 CRUD API 的指南

作者:API传播员 · 2025-10-16 · 阅读时间:6分钟
本文详细介绍了如何使用Oak框架和Deno KV构建一个功能完整的CRUD API,包括数据库模型设计、初始化项目、定义数据库逻辑、构建API路由以及运行和测试API的全过程。Deno KV的原子事务和一致性控制特性使得开发高效且易于维护。

使用 Oak 和 Deno KV 构建 CRUD API 的完整指南

Deno KV 不仅是一个简单灵活的键值存储,它还具备生产级数据库的特性,例如原子事务、一致性控制以及卓越的性能表现。在本文中,我们将通过一个简单的示例,使用 Oak 框架和 Deno KV 构建一个 CRUD API


数据库模型设计

我们将构建一个包含两个模型的 API:用户(User)和地址(Address)。其中,每个用户可以选择性地关联一个地址。

数据库模型示意图


初始化项目并定义数据库逻辑

创建 db.ts 文件

在项目的根目录下创建一个名为 db.ts 的文件,用于存放数据库的所有逻辑。首先,我们需要定义一些类型和辅助函数。

定义用户相关的数据库操作

  1. 获取用户信息

    使用 getUserById 函数通过用户 ID 获取用户信息。我们为每个用户定义了一个主键前缀 user,并结合用户的 ID 进行查询。

  2. 通过电子邮件获取用户

    为了支持通过电子邮件查询用户,我们需要创建一个辅助索引 user_by_email。该索引将电子邮件映射到用户的 ID。以下是实现逻辑:

    • 使用 user_by_email 作为键前缀存储用户的电子邮件和 ID。
    • 通过该索引获取用户 ID 后,再通过主键前缀 user 获取完整的用户信息。
  3. 更新用户信息

    在更新用户信息时,需要同时更新主键和辅助索引。如果用户的电子邮件发生变化,还需删除旧的索引并创建新的索引。为了保证数据一致性,我们使用 Deno KV 的事务功能 kv.atomic()

  4. 获取所有用户

    使用键迭代器枚举所有用户数据,并将结果存储到一个数组中返回。为了优化性能,可以通过传递选项 { limit: 50 } 分批获取用户数据。


添加地址模型

定义地址相关的数据库操作

  1. 获取用户地址

    使用 getAddressByUser 函数,通过用户 ID 获取其关联的地址信息。地址数据存储在以 user_address 为前缀的键空间中。

  2. 更新用户和地址

    在更新用户和地址时,需要同时更新多个键值对(useruser_by_emailuser_address)。为此,我们使用事务功能 kv.atomic() 确保操作的原子性。


删除用户及其关联数据

为了实现完整的 CRUD 功能,我们需要定义 deleteByUserId 函数。该函数会删除用户及其关联的所有数据,包括主键、辅助索引和地址信息。


构建 API 路由

创建 main.ts 文件

在项目根目录下创建一个名为 main.ts 的文件,用于定义 API 路由。我们将使用 Oak 框架(受 Koa 启发)来处理 HTTP 请求。

以下是主要的路由功能:

  • 添加用户:通过 POST 请求添加新用户。
  • 获取用户列表:通过 GET 请求获取所有用户。
  • 通过电子邮件获取用户:通过 GET 请求获取特定用户。
  • 更新用户信息:通过 PUT 请求更新用户数据。
  • 删除用户:通过 DELETE 请求删除用户及其关联数据。
  • 添加地址:通过 POST 请求为用户添加地址。
  • 获取用户地址:通过 GET 请求获取用户的地址信息。

运行和测试 API

启动服务

运行以下命令启动 API 服务:

deno run --allow-net --watch --unstable main.ts

测试 API 功能

  1. 添加用户

    curl -X POST http://localhost:8000/users -H "Content-Type: application/json" -d '{"id": "1", "email": "andy@deno.com", "name": "安迪", "password": "12345"}'

    在浏览器访问 http://localhost:8000/users,应返回以下 JSON 响应:

    JSON 响应示例

  2. 通过电子邮件获取用户

    在浏览器访问 http://localhost:8000/users/email/andy@deno.com,应返回用户信息:

    通过电子邮件获取用户

  3. 为用户添加地址

    curl -X POST http://localhost:8000/users/1/address -H "Content-Type: application/json" -d '{"city": "洛杉矶", "street": "主街"}'

    在浏览器访问 http://localhost:8000/users/1/address,应返回地址信息:

    用户地址响应

  4. 更新用户信息

    curl -X PUT http://localhost:8000/users -H "Content-Type: application/json" -d '{"id": "1", "email": "andy@deno.com", "name": "更好的安迪", "password": "12345"}'

    在浏览器访问 http://localhost:8000/users/1,应显示更新后的用户信息:

    更新用户信息响应

  5. 删除用户

    curl -X DELETE http://localhost:8000/users/1

    在浏览器访问 http://localhost:8000/users,应返回空列表:

    删除用户后响应


总结

通过本文的示例,我们展示了如何使用 Oak 框架和 Deno KV 构建一个功能完整的 CRUD API。Deno KV 的简单性和强大的事务支持,使得开发高效且易于维护。希望本文能帮助您快速上手并构建自己的有状态 API。

原文链接: https://deno.com/blog/build-crud-api-oak-denokv