Deno 是一个新兴的 JavaScript/TypeScript 运行时。它的设计目标是安全性和可维护性,以及对现代 JavaScript 和 TypeScript 的支持。在本文中,我们将使用 Deno 构建一个简单的博客应用程序,展示如何使用 Deno 构建 Web 应用程序。
安装 Deno
首先,您需要在本地安装 Deno。您可以从 Deno 的官方网站 https://deno.land/ 下载适用于您的操作系统的二进制文件。安装完成后,您可以在终端中运行以下命令以验证 Deno 是否正确安装:
$ deno --version
如果您看到了 Deno 的版本信息,那么说明您已经成功安装了 Deno。
初始化项目
接下来,我们将创建一个新的 Deno 项目。在终端中,进入您要创建项目的目录,并运行以下命令:
$ deno --allow-read --allow-write https://deno.land/std/examples/welcome.ts
该命令将下载一个示例文件,并将其保存在当前目录中。您可以将该文件命名为 app.ts
。
安装依赖项
在我们开始编写应用程序之前,我们需要安装一些 Deno 的依赖项。我们将使用一个名为 Oak 的框架来构建我们的应用程序。Oak 是一个轻量级的 Web 框架,它提供了一些基本的中间件和路由功能。在终端中,运行以下命令以安装 Oak:
$ deno install --allow-read --allow-net -f --unstable https://deno.land/x/oak/mod.ts
编写应用程序
现在,我们已经准备好开始编写我们的应用程序了。我们将创建一个简单的博客应用程序,其中包含以下功能:
- 创建新文章
- 获取所有文章
- 获取单个文章
- 更新文章
- 删除文章
首先,在 app.ts
文件中导入 Oak:
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
然后,我们将创建一个名为 router
的新路由器,并定义一些基本的路由:
-- -------------------- ---- ------- ----- ------ - --- --------- --------------- ----- -- - ----------------- - ------ -------- --- -------------------- ----- ----- -- - -- ----- ------ --- ------------------------ ----- ----- -- - -- ----- ------ --- --------------------- ----- ----- -- - -- ----- ----- --- ------------------------ ----- ----- -- - -- ----- ---- --- --------------------------- ----- ----- -- - -- ----- ---- ---
在这里,我们定义了五个路由,分别对应于上述五个功能。我们将在稍后的部分中实现它们。
接下来,我们需要创建一个名为 app
的新应用程序,并将路由器添加到应用程序中:
const app = new Application(); app.use(router.routes()); app.use(router.allowedMethods());
最后,我们需要将应用程序绑定到一个端口上,以便我们可以访问它。在 app.ts
文件的末尾,添加以下代码:
console.log("Server started on http://localhost:8000"); await app.listen({ port: 8000 });
现在,我们已经完成了应用程序的基本架构。接下来,我们将实现每个路由的功能。
获取所有文章
在 router.get("/posts")
路由中,我们需要获取所有文章并将它们返回给客户端。我们将使用一个名为 db.json
的 JSON 文件来存储文章。在 app.ts
文件的开头,添加以下代码:
const articlesFilePath = "./db.json"; const file = await Deno.open(articlesFilePath, { create: true, read: true, write: true }); let articles = JSON.parse(new TextDecoder().decode(await Deno.readAll(file)));
该代码将打开名为 db.json
的文件,如果文件不存在则创建它,并将文件内容解析为一个名为 articles
的数组。
现在,我们可以在 router.get("/posts")
路由中获取所有文章:
router.get("/posts", async (ctx) => { ctx.response.body = articles; });
获取单个文章
在 router.get("/posts/:id")
路由中,我们需要获取特定 ID 的文章并将其返回给客户端。在该路由中,我们将使用 URL 参数来指定文章的 ID。我们将使用 params
对象来获取 URL 参数值。在 router.get("/posts/:id")
路由中,添加以下代码:
-- -------------------- ---- ------- ----- -- - -------------- ----- ------- - ----------------- ---- -- ---- --- ---- -- ---------- - ------------------- - ---- ----------------- - - -------- ------- -- ------- - ----------------- - --------
该代码将使用 find
方法查找具有指定 ID 的文章。如果文章不存在,则返回 404 状态码和一个错误消息。
创建新文章
在 router.post("/posts")
路由中,我们需要创建一个新的文章并将其添加到 articles
数组中。我们将使用请求正文来获取新文章的信息。在 router.post("/posts")
路由中,添加以下代码:
-- -------------------- ---- ------- ----- ---- - ----- ------------------- -- ------------------ -- -------------------- - ------------------- - ---- ----------------- - - -------- ----------- -- ------- - ----- ---------- - - --- ------------------------------------ --- ------ ----------------- -------- ------------------- -- -------------------------- ----- ------------------- --- ------------------------------------------------ ------------------- - ---- ----------------- - -----------
该代码将从请求正文中获取文章的标题和内容。如果标题和内容都不为空,则创建一个新文章对象,并将其添加到 articles
数组中。然后,该代码将更新 db.json
文件,并返回新文章对象。
更新文章
在 router.put("/posts/:id")
路由中,我们需要更新特定 ID 的文章。我们将使用 URL 参数来指定文章的 ID,请求正文来获取更新后的文章信息。在 router.put("/posts/:id")
路由中,添加以下代码:
-- -------------------- ---- ------- ----- -- - -------------- ----- ---- - ----- ------------------- ----- ------------ - ---------------------- ---- -- ---- --- ---- -- ------------- --- --- - ------------------- - ---- ----------------- - - -------- ------- -- ------- - ---------------------- - - -------------------------- -------------- -- ----- ------------------- --- ------------------------------------------------ ----------------- - -----------------------
该代码将使用 findIndex
方法查找具有指定 ID 的文章。如果文章不存在,则返回 404 状态码和一个错误消息。否则,该代码将使用扩展运算符将请求正文中的属性合并到文章对象中。最后,该代码将更新 db.json
文件,并返回更新后的文章对象。
删除文章
在 router.delete("/posts/:id")
路由中,我们需要删除特定 ID 的文章。我们将使用 URL 参数来指定文章的 ID。在 router.delete("/posts/:id")
路由中,添加以下代码:
-- -------------------- ---- ------- ----- -- - -------------- ----- ------------ - ---------------------- ---- -- ---- --- ---- -- ------------- --- --- - ------------------- - ---- ----------------- - - -------- ------- -- ------- - ----------------------------- --- ----- ------------------- --- ------------------------------------------------ ------------------- - ----
该代码将使用 findIndex
方法查找具有指定 ID 的文章。如果文章不存在,则返回 404 状态码和一个错误消息。否则,该代码将使用 splice
方法从 articles
数组中删除文章。最后,该代码将更新 db.json
文件,并返回 204 状态码。
完整代码
下面是完整的 app.ts
文件:
-- -------------------- ---- ------- ------ - ------------ ------ - ---- --------------------------------- ----- ---------------- - ------------ ----- ---- - ----- --------------------------- - ------- ----- ----- ----- ------ ---- --- --- -------- - -------------- -------------------------- --------------------- ----- ------ - --- --------- --------------- ----- -- - ----------------- - ------ -------- --- -------------------- ----- ----- -- - ----------------- - --------- --- ------------------------ ----- ----- -- - ----- -- - -------------- ----- ------- - ----------------- ---- -- ---- --- ---- -- ---------- - ------------------- - ---- ----------------- - - -------- ------- -- ------- - ----------------- - -------- --- --------------------- ----- ----- -- - ----- ---- - ----- ------------------- -- ------------------ -- -------------------- - ------------------- - ---- ----------------- - - -------- ----------- -- ------- - ----- ---------- - - --- ------------------------------------ --- ------ ----------------- -------- ------------------- -- -------------------------- ----- ------------------- --- ------------------------------------------------ ------------------- - ---- ----------------- - ----------- --- ------------------------ ----- ----- -- - ----- -- - -------------- ----- ---- - ----- ------------------- ----- ------------ - ---------------------- ---- -- ---- --- ---- -- ------------- --- --- - ------------------- - ---- ----------------- - - -------- ------- -- ------- - ---------------------- - - -------------------------- -------------- -- ----- ------------------- --- ------------------------------------------------ ----------------- - ----------------------- --- --------------------------- ----- ----- -- - ----- -- - -------------- ----- ------------ - ---------------------- ---- -- ---- --- ---- -- ------------- --- --- - ------------------- - ---- ----------------- - - -------- ------- -- ------- - ----------------------------- --- ----- ------------------- --- ------------------------------------------------ ------------------- - ---- --- ----- --- - --- -------------- ------------------------- --------------------------------- ------------------- ------- -- ------------------------ ----- ------------ ----- ---- ---
运行应用程序
现在,我们已经完成了我们的应用程序。在终端中,进入 app.ts
文件所在的目录,并运行以下命令:
$ deno run --allow-read --allow-write --allow-net app.ts
该命令将启动我们的应用程序,并将其绑定到端口 8000 上。现在,您可以在浏览器中访问 http://localhost:8000,并使用您喜欢的 API 客户端测试我们的应用程序。
总结
在本文中,我们使用 Deno 构建了一个简单的博客应用程序。我们使用了 Oak 框架来处理路由和中间件。我们展示了如何使用 Deno 来读写文件,并使用 JSON 来存储数据。我们还展示了如何使用 URL 参数和请求正文来处理 HTTP 请求。该示例程序仅仅是一个入门级别的示例,但它可以帮助您了解如何使用 Deno 构建 Web 应用程序。如果您想深入了解 Deno,我们建议您查看 Deno 的官方文档。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6584f481d2f5e1655df90b7b