如何在 Deno 中构建基于 RESTful API 的 Web 应用

RESTful API 是一种基于 HTTP 协议的 API 设计风格,它具有简洁、灵活、易于扩展等优点,已经成为现代 Web 应用开发的标准。Deno 是一个新兴的 JavaScript 运行时环境,它提供了安全、稳定、高效的开发体验,也是构建基于 RESTful API 的 Web 应用的一个不错的选择。本文将介绍如何在 Deno 中构建基于 RESTful API 的 Web 应用,包括路由设计、数据存储、错误处理等方面的内容。

安装和使用 Deno

首先,我们需要安装 Deno。可以通过官网提供的一行命令来安装:

安装完成后,可以在命令行中输入 deno 来验证是否安装成功。

接下来,我们可以创建一个新的项目,例如:

app.ts 中,我们可以编写第一个 Deno 程序:

console.log("Hello, Deno!");

然后,我们可以在命令行中执行 deno run app.ts 来运行程序,输出结果为 Hello, Deno!

设计 RESTful API

在构建基于 RESTful API 的 Web 应用时,我们需要先设计 API 的路由和数据模型。路由是指 API 的 URL 地址,数据模型是指 API 的输入和输出数据格式。

例如,我们要构建一个简单的 TODO 应用,它包含以下 API:

  • GET /todos:获取所有 TODO
  • GET /todos/:id:获取指定 ID 的 TODO
  • POST /todos:创建新的 TODO
  • PUT /todos/:id:更新指定 ID 的 TODO
  • DELETE /todos/:id:删除指定 ID 的 TODO

对应的数据模型如下:

interface Todo {
  id: string;
  title: string;
  completed: boolean;
}

使用 Oak 框架

Deno 并没有自带 Web 框架,但是社区已经有很多成熟的框架可供选择。这里我们选择 Oak 框架作为示例。

首先,我们需要安装 Oak 框架:

然后,我们可以创建一个 router.ts 文件,定义 API 的路由和处理函数:

import { Router } from "https://deno.land/x/oak/mod.ts";

const router = new Router();

router.get("/todos", (ctx) => {
  // TODO: 处理获取所有 TODO 的逻辑
});

router.get("/todos/:id", (ctx) => {
  // TODO: 处理获取指定 ID 的 TODO 的逻辑
});

router.post("/todos", async (ctx) => {
  // TODO: 处理创建新的 TODO 的逻辑
});

router.put("/todos/:id", async (ctx) => {
  // TODO: 处理更新指定 ID 的 TODO 的逻辑
});

router.delete("/todos/:id", async (ctx) => {
  // TODO: 处理删除指定 ID 的 TODO 的逻辑
});

export default router;

然后,在 app.ts 中引入 router.ts 并启动应用:

import { Application } from "https://deno.land/x/oak/mod.ts";
import router from "./router.ts";

const app = new Application();

app.use(router.routes());
app.use(router.allowedMethods());

console.log("Server is running on http://localhost:8000");

await app.listen({ port: 8000 });

现在,我们可以在命令行中执行 deno run --allow-net app.ts 来启动应用,访问 http://localhost:8000/todos 即可获取所有 TODO。

使用 MongoDB 存储数据

在实际开发中,我们需要将数据存储到数据库中。这里我们选择 MongoDB 作为示例。

首先,我们需要安装 MongoDB 驱动:

然后,我们可以在 router.ts 中使用 MongoDB 驱动来操作数据:

import { Router } from "https://deno.land/x/oak/mod.ts";
import { MongoClient } from "https://deno.land/x/mongo/mod.ts";

const router = new Router();

const client = new MongoClient();
await client.connect("mongodb://localhost:27017");

const db = client.database("todo_app");
const todos = db.collection<Todo>("todos");

router.get("/todos", async (ctx) => {
  const result = await todos.find();
  ctx.response.body = result;
});

router.get("/todos/:id", async (ctx) => {
  const id = ctx.params.id!;
  const result = await todos.findOne({ _id: { $oid: id } });
  ctx.response.body = result;
});

router.post("/todos", async (ctx) => {
  const { value } = await ctx.request.body();
  const todo = await todos.insertOne(value);
  ctx.response.body = todo;
});

router.put("/todos/:id", async (ctx) => {
  const id = ctx.params.id!;
  const { value } = await ctx.request.body();
  const result = await todos.updateOne({ _id: { $oid: id } }, { $set: value });
  ctx.response.body = result;
});

router.delete("/todos/:id", async (ctx) => {
  const id = ctx.params.id!;
  const result = await todos.deleteOne({ _id: { $oid: id } });
  ctx.response.body = result;
});

export default router;

现在,我们可以在命令行中执行 deno run --allow-net --allow-write --allow-read --allow-plugin --unstable app.ts 来启动应用,访问 http://localhost:8000/todos 即可获取所有 TODO,并将它们存储到 MongoDB 中。

错误处理

在实际开发中,我们需要对 API 的错误进行处理。这里我们可以使用 Oak 框架提供的中间件来处理错误。

首先,我们可以创建一个 error.ts 文件,定义错误处理中间件:

import { Middleware } from "https://deno.land/x/oak/mod.ts";

const errorMiddleware: Middleware = async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    console.error(err);
    ctx.response.status = 500;
    ctx.response.body = { error: "Internal Server Error" };
  }
};

export default errorMiddleware;

然后,在 app.ts 中引入 error.ts 并使用错误处理中间件:

import { Application } from "https://deno.land/x/oak/mod.ts";
import router from "./router.ts";
import errorMiddleware from "./error.ts";

const app = new Application();

app.use(errorMiddleware);
app.use(router.routes());
app.use(router.allowedMethods());

console.log("Server is running on http://localhost:8000");

await app.listen({ port: 8000 });

现在,我们可以在命令行中执行 deno run --allow-net --allow-write --allow-read --allow-plugin --unstable app.ts 来启动应用,访问不存在的 URL 地址即可触发错误处理中间件。

总结

本文介绍了如何在 Deno 中构建基于 RESTful API 的 Web 应用,包括路由设计、数据存储、错误处理等方面的内容。Deno 提供了安全、稳定、高效的开发体验,Oak 框架提供了方便、灵活、易于扩展的 Web 开发工具,MongoDB 驱动提供了数据存储和查询的功能,这些工具的组合可以帮助我们快速构建现代化的 Web 应用。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658ab182eb4cecbf2dff269f


纠错
反馈