使用 Deno 和 Oak 构建 RESTful API

阅读时长 14 分钟读完

最近,Deno 和 Oak 成为了前端开发的热门话题。Deno 是一个基于 Rust 和 V8 引擎的新兴 JavaScript / TypeScript 运行时环境,Oak 则是基于 Deno 的服务器框架,设计灵感来自 Koa。

在本文中,我们将探讨如何使用 Deno 和 Oak 这两个工具来构建 RESTful API,并借助 TypeScript 的强类型特性和 Deno 的安全机制来提供更好的代码可读性和代码安全性以及容错性。

什么是 RESTful API

RESTful API 是基于 HTTP 协议,使用 CRUD 语义实现资源的创建、读取、更新和删除的一种网络 API 设计方式。它提供了一组通用的架构约束和超媒体链接,以便使用客户端与服务器之间共享功能。

RESTful API 的优点包括可伸缩、可扩展、易于缓存、分层等。

为什么选择 Deno 和 Oak

与 Node.js 相比,Deno 具有更好的安全性、更好的模块管理、更易于调试和更好的性能。并且,Deno 可以以更少的模块进行安全开发,这大大降低了代码维护的难度。

同时,Oak 是 Deno 上用于构建 Web 应用程序的 Koa 风格的 Web 框架,并具有 Koa 的许多知名优点,如易于定制、开箱即用、优雅等。

如何使用 Deno 和 Oak 构建 RESTful API

安装 Deno 和 Oak

首先,我们需要在本地机器上安装 Deno 和 Oak。你可以从 Deno 的官方网站(https://deno.land/)下载 Deno 的安装包,或者使用 Homebrew 安装 Deno:

然后,使用 Deno 自带的包管理器安装 Oak 模块:

编写 RESTful API

我们将实现一个简单的用户管理 RESTful API,包括以下操作:

  1. 获取所有用户
  2. 获取指定用户
  3. 创建用户
  4. 更新用户
  5. 删除用户

在项目根目录下,新建一个名为 server.ts 的文件,输入以下代码:

-- -------------------- ---- -------
------ - ------------ ------- - ---- ------

--------- ---- -
  --- -------
  ----- -------
-

--- ------ ------ - -
  - --- ---- ----- ------- --
  - --- ---- ----- ----- --
  - --- ---- ----- --------- --
--

----- --- - --- --------------

------------- ----- -------- ----- -- -
  ----- -------
  ----- -- - --------------------------------------------
  ---------------------------------- --------------------------- - --------
---

------------- ----- -------- ----- -- -
  ----- ----- - -----------
  ----- -------
  ----- -- - ---------- - ------
  ------------------------------------------- -----------
---

------------- ----- -------- -- -
  ------ -------------------- -
    ---- ------
      ----- ---- - ------------------------------------
      -- ------------ --- - -- ------- --- -------- -
        ----------------- - ------
      - ---- -- ------------ --- - -- ------- --- -------- -
        ----- ---- - -------------- -- ---- -- ---------
        -- ------ -
          ----------------- - -----
        - ---- -
          ------------------- - ----
        -
      - ---- -
        ------------------- - ----
      -
      ------
    ---- -------
      -- --------------------- -
        ----- ------ - ----- -------------------------
        ----- ----- ---- - - --- ------------------- - --- ----- ----------- --
        -----------------
        ------------------- - ----
        ----------------- - -----
      - ---- -
        ------------------- - ----
      -
      ------
    ---- ------
      -- --------------------- -
        ----- ------ - ----- -------------------------
        ----- ---- - ------------------------------------
        -- ------------ --- - -- ------- --- -------- -
          ----- --------- - ------------------- -- ---- -- ---------
          -- ---------- --- --- -
            --------------------- - ------------
            ------------------- - ----
          - ---- -
            ------------------- - ----
          -
        - ---- -
          ------------------- - ----
        -
      - ---- -
        ------------------- - ----
      -
      ------
    ---- ---------
      ----- ---- - ------------------------------------
      -- ------------ --- - -- ------- --- -------- -
        ----- --------- - ------------------- -- ---- -- ---------
        -- ---------- --- --- -
          ----------------------- ---
          ------------------- - ----
        - ---- -
          ------------------- - ----
        -
      - ---- -
        ------------------- - ----
      -
      ------
    --------
      ------------------- - ----
      --------------------------------- ----- ----- ---- ---------
      ------
  -
---

------------------- ------- -- ------------------------
----- ------------ ----- ---- ---

该代码中,我们定义了一个 User 接口,表示用户实体,同时我们初始化了一个 users 数据源,模拟了用户数据。然后我们通过 Application 类创建了一个 Oak 应用程序对象,并分别调用了三个中间件函数:responseTimeMiddlewareloggerMiddlewarerouterMiddleware。其中 routerMiddleware 的核心代码如下:

-- -------------------- ---- -------
------ -------------------- -
  ---- ------
    -- ---
    ------
  ---- -------
    -- ---
    ------
  ---- ------
    -- ---
    ------
  ---- ---------
    -- ---
    ------
  --------
    ------------------- - ----
    --------------------------------- ----- ----- ---- ---------
    ------
-

该函数根据 HTTP 请求方法的不同路由到具体的请求处理逻辑。其中,GET 方法包括获取所有用户和获取指定用户两种情况,POST 方法用于创建用户,PUT 方法用于更新用户,DELETE 方法用于删除用户。当请求方法不满足上述四种情况时,我们将 HTTP 状态码设置为 405(Method Not Allowed),并设置 Allow 响应头,通知客户端可接受的请求方法。

运行 RESTful API

接下来,我们在终端中进入项目根目录,运行如下命令:

该命令将在本地 8080 端口启动我们的服务。可以通过浏览器或者 HTTP 接口工具如 Postman 等方式进行测试。

使用 TypeScript

使用 TypeScript 可以大大提高代码的可读性以及类型安全性。我们在前文中提到的代码中添加 TypeScript 的支持十分简单,只需将文件名改为 server.ts,然后在文件头部添加以下代码即可:

-- -------------------- ---- -------
-- ---------

------ - ------------ ------- - ---- ------

--------- ---- -
  --- -------
  ----- -------
-

--- ------ ------ - -
  - --- ---- ----- ------- --
  - --- ---- ----- ----- --
  - --- ---- ----- --------- --
--

----- --- - --- --------------

------------- ----- -------- ----- -- -- -------------- -- -
  ----- -------
  ----- -- - --------------------------------------------
  ---------------------------------- --------------------------- - --------
---

------------- ----- -------- ----- -- -- -------------- -- -
  ----- ----- - -----------
  ----- -------
  ----- -- - ---------- - ------
  ------------------------------------------- -----------
---

------------- ----- -------- -- -
  ------ -------------------- -
    ---- ------
      ----- ---- - ------------------------------------
      -- ------------ --- - -- ------- --- -------- -
        ----------------- - ------
      - ---- -- ------------ --- - -- ------- --- -------- -
        ----- ---- - -------------- -- ---- -- ---------
        -- ------ -
          ----------------- - -----
        - ---- -
          ------------------- - ----
        -
      - ---- -
        ------------------- - ----
      -
      ------
    ---- -------
      -- --------------------- -
        ----- ------ - ----- ------------------------ -- - ----- ------ --
        ----- ----- ---- - - --- ------------------- - --- ----- ----------- --
        -----------------
        ------------------- - ----
        ----------------- - -----
      - ---- -
        ------------------- - ----
      -
      ------
    ---- ------
      -- --------------------- -
        ----- ------ - ----- ------------------------ -- - ----- ------ --
        ----- ---- - ------------------------------------
        -- ------------ --- - -- ------- --- -------- -
          ----- --------- - ------------------- -- ---- -- ---------
          -- ---------- --- --- -
            --------------------- - ------------
            ------------------- - ----
          - ---- -
            ------------------- - ----
          -
        - ---- -
          ------------------- - ----
        -
      - ---- -
        ------------------- - ----
      -
      ------
    ---- ---------
      ----- ---- - ------------------------------------
      -- ------------ --- - -- ------- --- -------- -
        ----- --------- - ------------------- -- ---- -- ---------
        -- ---------- --- --- -
          ----------------------- ---
          ------------------- - ----
        - ---- -
          ------------------- - ----
        -
      - ---- -
        ------------------- - ----
      -
      ------
    --------
      ------------------- - ----
      --------------------------------- ----- ----- ---- ---------
      ------
  -
---

------------------- ------- -- ------------------------
----- ------------ ----- ---- ---

与 JavaScript 代码相比,我们使用 as 关键字显式指定 result 的类型,提高了类型安全性,并统一了代码的风格。

总结

Deno 和 Oak 是现代化的技术栈,提供了更好的安全性、易用性、开发效率和性能表现。通过使用 TypeScript,我们可以降低代码维护的复杂度和提高代码的可读性和可维护性。希望本文能为读者提供帮助和启发,让大家在前端领域的学习和实践中能够更加高效和友好。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645b0c7b968c7c53b0d69446

纠错
反馈