简介
Deno 是一个现代化的 JavaScript 和 TypeScript 运行环境,由 Node.js 的创始人 Ryan Dahl 开发。相比于 Node.js,Deno 更加安全、易用、可靠和高效。MySQL 是一个流行的关系型数据库。在本文中,我们将使用 Deno 和 MySQL 来构建一个 REST API,以实现数据的增删改查操作。
准备工作
在开始之前,我们需要安装 Deno 和 MySQL。Deno 的安装可以参考官方文档:https://deno.land/manual/getting_started/installation。而 MySQL 的安装可以参考官方文档:https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/。
我们还需要安装一些 Deno 的模块,包括 oak
、mysql
和 dotenv
。oak
是一个基于中间件的 Web 框架,mysql
是一个 MySQL 客户端,而 dotenv
则是一个用于加载环境变量的模块。
可以使用以下命令来安装这些模块:
deno install --allow-read --allow-net --allow-env https://deno.land/x/dotenv/mod.ts deno install --allow-read --allow-net https://deno.land/x/mysql/mod.ts deno install --allow-read --allow-net https://deno.land/x/oak/mod.ts
创建数据库
在开始编写代码之前,我们需要创建一个名为 test
的数据库,并在其中创建一个名为 users
的表。可以使用以下 SQL 语句来创建这个表:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
编写代码
我们将编写一个 REST API,包含以下四个路由:
GET /users
:获取所有用户GET /users/:id
:根据 ID 获取用户POST /users
:创建用户PUT /users/:id
:根据 ID 更新用户DELETE /users/:id
:根据 ID 删除用户
在开始编写代码之前,我们先创建一个名为 config.ts
的文件,用于加载环境变量和创建 MySQL 连接池:
// javascriptcn.com 代码示例 import { Client } from "https://deno.land/x/mysql/mod.ts"; import { config } from "https://deno.land/x/dotenv/mod.ts"; const { DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME } = config(); export const pool = await new Client().connect({ hostname: DB_HOST, port: +DB_PORT, username: DB_USER, password: DB_PASSWORD, db: DB_NAME, });
接下来,我们创建一个名为 users.ts
的文件,用于定义用户模型和路由处理函数:
// javascriptcn.com 代码示例 import { Router, Context } from "https://deno.land/x/oak/mod.ts"; import { pool } from "./config.ts"; interface User { id: number; name: string; email: string; password: string; } export const router = new Router(); router.get("/users", async (ctx: Context) => { const result = await pool.query("SELECT * FROM users"); const users: User[] = result.rows.map((row: any) => ({ id: row.id, name: row.name, email: row.email, password: row.password, })); ctx.response.body = users; }); router.get("/users/:id", async (ctx: Context) => { const id = ctx.params.id; const result = await pool.query("SELECT * FROM users WHERE id = ?", [id]); if (result.rows.length === 0) { ctx.response.status = 404; ctx.response.body = { message: "User not found" }; } else { const user: User = { id: result.rows[0].id, name: result.rows[0].name, email: result.rows[0].email, password: result.rows[0].password, }; ctx.response.body = user; } }); router.post("/users", async (ctx: Context) => { const { name, email, password } = await ctx.request.body().value; const result = await pool.query( "INSERT INTO users (name, email, password) VALUES (?, ?, ?)", [name, email, password], ); const user: User = { id: result.lastInsertId, name, email, password, }; ctx.response.status = 201; ctx.response.body = user; }); router.put("/users/:id", async (ctx: Context) => { const id = ctx.params.id; const { name, email, password } = await ctx.request.body().value; const result = await pool.query( "UPDATE users SET name = ?, email = ?, password = ? WHERE id = ?", [name, email, password, id], ); if (result.affectedRows === 0) { ctx.response.status = 404; ctx.response.body = { message: "User not found" }; } else { const user: User = { id: +id, name, email, password, }; ctx.response.body = user; } }); router.delete("/users/:id", async (ctx: Context) => { const id = ctx.params.id; const result = await pool.query("DELETE FROM users WHERE id = ?", [id]); if (result.affectedRows === 0) { ctx.response.status = 404; ctx.response.body = { message: "User not found" }; } else { ctx.response.status = 204; } });
最后,我们创建一个名为 app.ts
的文件,用于启动服务器:
// javascriptcn.com 代码示例 import { Application } from "https://deno.land/x/oak/mod.ts"; import { config } from "https://deno.land/x/dotenv/mod.ts"; import { router } from "./users.ts"; const { PORT } = config(); const app = new Application(); app.use(router.routes()); app.use(router.allowedMethods()); console.log(`Listening on port ${PORT}...`); await app.listen({ port: +PORT });
运行代码
运行以下命令来启动服务器:
deno run --allow-read --allow-net --allow-env app.ts
然后,我们可以使用 Postman 或其他工具来测试 API,例如:
- GET http://localhost:8000/users
- GET http://localhost:8000/users/1
- POST http://localhost:8000/users
- Body: {"name": "Alice", "email": "alice@example.com", "password": "password"}
- PUT http://localhost:8000/users/1
- Body: {"name": "Bob", "email": "bob@example.com", "password": "password"}
- DELETE http://localhost:8000/users/1
总结
本文介绍了如何使用 Deno 和 MySQL 来构建一个 REST API,以实现数据的增删改查操作。我们使用了 Deno 的模块和 MySQL 客户端来简化开发,并使用了基于中间件的 Web 框架 oak
来处理路由。这个示例代码可以作为学习 Deno 和 MySQL 开发的指导,也可以作为实际项目的基础。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65703a08d2f5e1655d8f19bd