RESTful API 是一种基于 HTTP 协议的 API 设计风格,它具有简洁、灵活、易于扩展等优点,已经成为现代 Web 应用开发的标准。Deno 是一个新兴的 JavaScript 运行时环境,它提供了安全、稳定、高效的开发体验,也是构建基于 RESTful API 的 Web 应用的一个不错的选择。本文将介绍如何在 Deno 中构建基于 RESTful API 的 Web 应用,包括路由设计、数据存储、错误处理等方面的内容。
安装和使用 Deno
首先,我们需要安装 Deno。可以通过官网提供的一行命令来安装:
curl -fsSL https://deno.land/x/install/install.sh | sh
安装完成后,可以在命令行中输入 deno
来验证是否安装成功。
接下来,我们可以创建一个新的项目,例如:
mkdir deno-restful-api cd deno-restful-api touch app.ts
在 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 框架:
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
然后,我们可以创建一个 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 驱动:
import { MongoClient } from "https://deno.land/x/mongo/mod.ts";
然后,我们可以在 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