使用 Oak 和 Deno KV 构建完整 CRUD API 的指南
使用 Oak 和 Deno KV 构建 CRUD API 的完整指南
Deno KV 不仅是一个简单灵活的键值存储,它还具备生产级数据库的特性,例如原子事务、一致性控制以及卓越的性能表现。在本文中,我们将通过一个简单的示例,使用 Oak 框架和 Deno KV 构建一个 CRUD API。
数据库模型设计
我们将构建一个包含两个模型的 API:用户(User)和地址(Address)。其中,每个用户可以选择性地关联一个地址。

初始化项目并定义数据库逻辑
创建 db.ts 文件
在项目的根目录下创建一个名为 db.ts 的文件,用于存放数据库的所有逻辑。首先,我们需要定义一些类型和辅助函数。
定义用户相关的数据库操作
-
获取用户信息
使用
getUserById函数通过用户 ID 获取用户信息。我们为每个用户定义了一个主键前缀user,并结合用户的 ID 进行查询。 -
通过电子邮件获取用户
为了支持通过电子邮件查询用户,我们需要创建一个辅助索引
user_by_email。该索引将电子邮件映射到用户的 ID。以下是实现逻辑:- 使用
user_by_email作为键前缀存储用户的电子邮件和 ID。 - 通过该索引获取用户 ID 后,再通过主键前缀
user获取完整的用户信息。
- 使用
-
更新用户信息
在更新用户信息时,需要同时更新主键和辅助索引。如果用户的电子邮件发生变化,还需删除旧的索引并创建新的索引。为了保证数据一致性,我们使用 Deno KV 的事务功能
kv.atomic()。 -
获取所有用户
使用键迭代器枚举所有用户数据,并将结果存储到一个数组中返回。为了优化性能,可以通过传递选项
{ limit: 50 }分批获取用户数据。
添加地址模型
定义地址相关的数据库操作
-
获取用户地址
使用
getAddressByUser函数,通过用户 ID 获取其关联的地址信息。地址数据存储在以user_address为前缀的键空间中。 -
更新用户和地址
在更新用户和地址时,需要同时更新多个键值对(
user、user_by_email和user_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 功能
-
添加用户
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 响应:
-
通过电子邮件获取用户
在浏览器访问
http://localhost:8000/users/email/andy@deno.com,应返回用户信息:
-
为用户添加地址
curl -X POST http://localhost:8000/users/1/address -H "Content-Type: application/json" -d '{"city": "洛杉矶", "street": "主街"}'在浏览器访问
http://localhost:8000/users/1/address,应返回地址信息:
-
更新用户信息
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,应显示更新后的用户信息:
-
删除用户
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
最新文章
- 如何使用 PostgREST 和 Apache APISIX 构建高效、安全的 RESTful API 解决方案
- 什么是SQL注入?理解、风险与防范技巧
- Excel中,创建一个公式来调用ChatGPT API并返回结果
- 告别Mock服务: 用Chrome DevTools模拟API数据
- 如何获取DeepL API Key 密钥(分步指南)
- Google AI实验背后的API技术:Doodle交互玩法拆解
- 5分钟掌握高德地图API如何调用
- Claude 代码生成被限流?免费与付费替代工具全面对比
- Envoy Gateway 的 Gateway API 扩展功能介绍 – Tetrate
- 使用Django REST Framework构建API——第二部分
- 鸿蒙应用实践:利用扣子API开发起床文案生成器
- 如何获取OpenRouter API Key 密钥(分步指南)