使用 Deno 创建 REST API 的基本步骤
在本章中,我们将介绍如何使用 Deno 框架来创建一个简单的 REST API。我们将从创建项目的基本结构开始,然后逐步添加路由、控制器和中间件等组件。
创建项目文件夹
首先,我们需要创建一个新的文件夹用于存放我们的项目文件。可以使用命令行工具或者文件浏览器来创建新的文件夹,例如:
mkdir deno-rest-api cd deno-rest-api
初始化项目
接下来,我们需要初始化项目。在 Deno 中,我们可以通过创建 deno.json 文件来配置项目。这个文件类似于 Node.js 的 package.json 或者 Python 的 pyproject.toml。
// www.javascriptcn.com code example
{
"name": "deno-rest-api",
"version": "1.0.0",
"description": "A simple REST API using Deno",
"license": "MIT",
"dependencies": {
"https://deno.land/x/oak/mod.ts": "v9"
}
}安装依赖
在 Deno 中,我们可以通过运行以下命令来安装项目依赖:
deno install --import-map=deno.json https://deno.land/x/oak/mod.ts
这里我们使用了 Oak 框架,这是一个流行的 Deno 框架,它提供了许多与 Express 类似的功能。
创建入口文件
接下来,我们需要创建一个入口文件,用于启动我们的服务器。在这个例子中,我们将创建一个名为 server.ts 的文件,并将其作为项目的入口点。
// www.javascriptcn.com code example
import { Application } from "https://deno.land/x/oak/mod.ts";
const app = new Application();
app.use((ctx) => {
ctx.response.body = "Hello World!";
});
console.log("Listening on port 8000");
await app.listen({ port: 8000 });运行服务器
最后,我们可以使用以下命令来运行我们的服务器:
deno run --allow-net server.ts
打开浏览器并访问 http://localhost:8000,你应该能看到 "Hello World!" 的输出。
添加路由和控制器
在本节中,我们将学习如何为我们的 API 添加更多的路由和控制器。
添加路由
为了更好地组织代码,我们可以在 routes 文件夹中创建不同的路由文件。例如,我们可以在 routes/users.ts 文件中定义用户相关的路由。
// www.javascriptcn.com code example
import { Router } from "https://deno.land/x/oak/mod.ts";
const router = new Router();
router.get("/users", (context) => {
context.response.body = [{ id: 1, name: "John Doe" }];
});
export default router;注册路由
然后,我们需要在主入口文件中注册这些路由。
// www.javascriptcn.com code example
import { Application } from "https://deno.land/x/oak/mod.ts";
import userRoutes from "./routes/users.ts";
const app = new Application();
app.use(userRoutes.routes());
app.use(userRoutes.allowedMethods());
console.log("Listening on port 8000");
await app.listen({ port: 8000 });添加控制器
为了更好地分离业务逻辑,我们可以在 controllers 文件夹中创建控制器文件。例如,我们可以在 controllers/userController.ts 文件中定义用户相关的控制器。
export const getUsers = () => {
return [{ id: 1, name: "John Doe" }];
};然后在路由文件中使用控制器。
// www.javascriptcn.com code example
import { Router } from "https://deno.land/x/oak/mod.ts";
import { getUsers } from "../controllers/userController.ts";
const router = new Router();
router.get("/users", (context) => {
context.response.body = getUsers();
});
export default router;添加中间件
中间件是在请求到达控制器之前或之后执行的函数。它们可以用于日志记录、身份验证等多种用途。
创建中间件
我们可以在 middlewares 文件夹中创建中间件文件。例如,我们可以在 middlewares/logger.ts 文件中定义一个简单的日志中间件。
import { Context } from "https://deno.land/x/oak/mod.ts";
export const loggerMiddleware = ({ request, response }: Context, next) => {
console.log(`Request ${request.method} ${request.url}`);
await next();
console.log(`Response status ${response.status}`);
};注册中间件
然后,我们需要在主入口文件中注册中间件。
// www.javascriptcn.com code example
import { Application } from "https://deno.land/x/oak/mod.ts";
import userRoutes from "./routes/users.ts";
import { loggerMiddleware } from "./middlewares/logger.ts";
const app = new Application();
app.use(loggerMiddleware);
app.use(userRoutes.routes());
app.use(userRoutes.allowedMethods());
console.log("Listening on port 8000");
await app.listen({ port: 8000 });添加数据库支持
在本节中,我们将学习如何为我们的 API 添加数据库支持。我们将使用 Deno 的原生 SQL 支持来连接 SQLite 数据库。
安装 SQLite3 模块
首先,我们需要安装 SQLite3 模块。
deno install --allow-read --allow-write --allow-net --unstable https://deno.land/x/sqlite3/mod.ts
配置数据库
然后,我们需要在项目根目录下创建一个 database 文件夹,并在其中创建一个 SQLite 数据库文件。
mkdir database sqlite3 database/users.db < schema.sql
这里的 schema.sql 文件包含数据库的结构定义。
连接数据库
接下来,我们需要在项目中添加一个数据库连接模块。
import { open } from "https://deno.land/x/sqlite3/mod.ts";
const db = open("./database/users.db");
export default db;使用数据库
最后,我们需要在控制器中使用数据库。
import db from "../database/db.ts";
export const getUsers = async () => {
const result = await db.all("SELECT * FROM users");
return result;
};总结
通过本章的学习,我们了解了如何使用 Deno 来创建一个简单的 REST API。我们从创建项目的基本结构开始,逐步添加了路由、控制器和中间件等组件,并最终实现了数据库的支持。希望这能帮助你在 Deno 上构建更复杂的 Web 应用程序。