前言
Deno 是一个基于 V8 引擎的 JavaScript/TypeScript 运行时,由 Node.js 的创始人 Ryan Dahl 开发。相比于 Node.js,Deno 更加安全、更加简洁,而且自带 TypeScript 支持。
本文将介绍如何在 Deno 中实现一个简单的 CRUD RESTful API,希望能为初学者提供一些指导。
环境搭建
首先,需要安装 Deno 运行时。可以到官网(https://deno.land/)下载安装包,也可以使用包管理器(如 Homebrew)安装。
安装完成后,可以使用以下命令检查是否安装成功:
deno --version
接着,需要安装一个简单的 HTTP 服务器,这里我们使用 Oak。Oak 是一个基于中间件的 Web 框架,类似于 Node.js 中的 Express。
可以使用以下命令安装 Oak:
deno install --allow-net --allow-read https://deno.land/x/oak/mod.ts
实现 CRUD RESTful API
接下来,我们将通过实现一个简单的 Todo 应用程序来学习如何在 Deno 中实现 CRUD RESTful API。
创建数据模型
首先,我们需要创建一个数据模型来存储 Todo 数据。在本例中,我们只需要存储 Todo 的标题和完成状态。
interface Todo {
id: string;
title: string;
completed: boolean;
}创建路由
接下来,我们需要创建路由来处理 HTTP 请求。在 Oak 中,路由是由中间件组成的。
// www.javascriptcn.com code example
import { Router } from "https://deno.land/x/oak/mod.ts";
const router = new Router();
router.get("/todos", getAllTodos);
router.get("/todos/:id", getTodoById);
router.post("/todos", createTodo);
router.put("/todos/:id", updateTodo);
router.delete("/todos/:id", deleteTodo);
export default router;我们定义了 5 个路由:
- GET /todos:获取所有 Todo
- GET /todos/:id:根据 ID 获取 Todo
- POST /todos:创建新的 Todo
- PUT /todos/:id:更新指定的 Todo
- DELETE /todos/:id:删除指定的 Todo
实现路由处理函数
接下来,我们需要实现路由处理函数来处理 HTTP 请求。在本例中,我们将数据存储在内存中,而不是使用数据库。
// www.javascriptcn.com code example
let todos: Todo[] = [];
function getAllTodos(ctx: any) {
ctx.response.body = todos;
}
function getTodoById(ctx: any) {
const id = ctx.params.id;
const todo = todos.find((todo) => todo.id === id);
if (!todo) {
ctx.response.status = 404;
ctx.response.body = { message: "Todo not found" };
} else {
ctx.response.body = todo;
}
}
async function createTodo(ctx: any) {
const body = await ctx.request.body();
const { title } = body.value;
const todo: Todo = {
id: Math.random().toString(36).substr(2, 9),
title,
completed: false,
};
todos.push(todo);
ctx.response.body = todo;
ctx.response.status = 201;
}
async function updateTodo(ctx: any) {
const id = ctx.params.id;
const todo = todos.find((todo) => todo.id === id);
if (!todo) {
ctx.response.status = 404;
ctx.response.body = { message: "Todo not found" };
} else {
const body = await ctx.request.body();
const { title, completed } = body.value;
todo.title = title || todo.title;
todo.completed = completed || todo.completed;
ctx.response.body = todo;
}
}
function deleteTodo(ctx: any) {
const id = ctx.params.id;
const index = todos.findIndex((todo) => todo.id === id);
if (index === -1) {
ctx.response.status = 404;
ctx.response.body = { message: "Todo not found" };
} else {
todos.splice(index, 1);
ctx.response.status = 204;
}
}在 getAllTodos 函数中,我们将所有的 Todo 返回给客户端。
在 getTodoById 函数中,我们根据 ID 查找指定的 Todo。如果找到了,我们将 Todo 返回给客户端;否则,返回 404 错误。
在 createTodo 函数中,我们从 HTTP 请求中获取 Todo 的标题,并为其生成一个随机的 ID。然后,我们将 Todo 存储在内存中,并将其返回给客户端。
在 updateTodo 函数中,我们根据 ID 查找指定的 Todo。如果找到了,我们从 HTTP 请求中获取 Todo 的标题和完成状态,并更新 Todo。然后,我们将更新后的 Todo 返回给客户端;否则,返回 404 错误。
在 deleteTodo 函数中,我们根据 ID 查找指定的 Todo。如果找到了,我们从内存中删除 Todo;否则,返回 404 错误。注意,我们在删除 Todo 后返回 204 状态码,表示请求成功但没有响应内容。
运行应用程序
最后,我们需要运行应用程序。可以使用以下命令:
deno run --allow-net app.ts
在浏览器中访问 http://localhost:8000/todos 即可查看所有 Todo。可以使用 Postman 或类似工具来测试其他路由。
总结
本文介绍了如何在 Deno 中实现一个简单的 CRUD RESTful API。通过本例,我们学习了如何使用 Oak 创建路由、如何实现路由处理函数以及如何存储数据。希望本文能对初学者提供一些指导。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/65fb9866d10417a22272c8bb