Deno 中使用 TypeScript 构建 Restful API 的实例解析

前言

Deno 是一个以安全、现代化、稳定等特点为标志的 JavaScript/TypeScript 运行时环境,不仅有着 Chrome V8 引擎的高性能执行能力,还内置了网络请求、文件操作等各种常用 API,并采用了单线程、异步、事件驱动等技术架构使其更适合于高并发、高性能、高安全的网络开发。

本文将介绍如何使用 Deno 搭建 Restful API,以及使用 TypeScript 增强接口的安全性和可读性。

准备工作

在本文中,我们将使用 oakdenon 作为搭建 restful API 的主要工具。

oak 是一个基于 Deno 开发的中间件框架,支持各种中间件和路由功能,可以帮助我们轻松地构建 API 接口。

denon 则是 Deno 中的一个文件变化监视工具,可以监听文件变化,自动重启服务,以减少我们的开发时间和工作量。

这里我们使用如下命令安装以上两个工具:

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

搭建 API

首先,我们需要创建一个工作目录,以示例中的 deno-rest-api 为例:

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

然后,我们创建一个名为 src 的文件夹来存放源代码,并在该文件夹中创建一个名为 app.ts 的文件。该文件将作为我们 API 的入口文件。

接下来,我们将简单构建一些路由功能,并使用 oak 系统。

在 app.ts 中,我们引入需要使用的 oakdotenv

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

我们在 API 的入口文件中初始化一个应用,并设置路由:

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

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

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

上述代码中,我们创建了一个新的应用(app)和一个新的路由(router),并定义了一个 GET 请求。

对于 / 路由,返回 Hello Deno! 字符串。接下来,我们将使用 dotenv 来设置我们的端口:

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

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

最后,我们在项目根目录下创建 .env 文件,并添加以下内容:

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

接下来我们就可以使用以下命令来启动我们的服务:

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

若启动成功,在我们的服务监听到 HOSTNAMEPORT 指向的地址时,它将显示 Listening on localhost:8000

现在我们的 API 已经开始运行了,然而它只有一个测试的 / 路由。接下来我们将为其添加更多的路由功能和数据库支持。

添加数据库支持

对于大多数的 Web 应用来说,面对的数据操作大多都是 CRUD 操作,因此在这里我们选择了 PostgreSQL 作为我们需要使用的数据库。

运行以下命令以下载 Postgres 驱动:

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

接下来,我们在根目录下创建 .env 文件,并添加如下内容:

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

我们将使用 denon 工具来启动服务,因此我们创建一个名为 denon.json 的文件,并添加以下内容:

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

scripts 配置中,我们定义了一个名为 db:start 的脚本,用于启动我们的 Postgres 服务。

由于 Docker 上安装的 Postgres 服务已经可以提供我们所需的功能,我们可以利用 Docker Compose 快速搭建数据库环境。以下是 Docker Compose 配置文件,包含一些基本的设置:

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

接下来,我们在项目根目录新建 db 文件夹,并在其中新建 queries.ts 文件,该文件包含用于与数据库进行 CRUD 操作的函数。

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

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

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

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

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

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

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

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

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

上述代码中,我们定义了 PG_HOSTPG_PORTPG_USERPG_PASSWORDPG_DB,这些变量来自于 .env 文件,可以自行选择更改。

接下来,我们定义了 executeQuery 函数,它将执行传递到它的 SQL 查询,并将结果转换为对象数组。

最后,我们定义了 getAllPersonsaddPersondeletePerson 等函数,用于与数据库进行交互。

接下来,我们在 app.ts 文件中加入新路由管理方式,使其能够通过 API 访问上述函数:

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

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

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

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

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

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

最终,我们的 API 现在支持通过以下路径访问 Postgres 数据库:

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

使用 TypeScript 增强接口的安全性和可读性

TypeScript 是一种由 Microsoft 开发的开源编程语言,它是 JavaScript 的超集,可以在 JavaScript 中为变量和函数添加类型注释。在数据类型存储、函数调用等方面提供了极大的帮助。

在我们的例子中,我们可以通过 TypeScript 来增强我们的 API 接口的可读性和安全性。需要先安装 typestsconfig.json

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

tsconfig.json 文件中添加以下代码:

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

app.ts中,我们可以创建一个名为 Person 的接口,它负责定义我们从 Postgres 数据库返回的对象结构:

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

现在,我们可以使用 Person 接口来增加对我们接口的客户端开发者的可读性和安全性。我们可以使用 Person 接口来强制类型定义所有与数据库工作的函数。

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

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

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

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

在上述代码中,我们使用了类似于 executeQuery 的方法,但它增加了泛型类型的支持。现在,我们可以为所有类型添加显式的函数签名,以避免对类型的错误推断或强制类型定义。

从而得出如下错误提示:

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

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

这样,我们就可以使用 TypeScript 增加我们接口的可读性和安全性。

结论

本文我们了解了如何使用 Deno 和 TypeScript 构建 Restful API。我们从学习一些基本概念开始,到学习如何使用 oakdenon 创建路由接口,从而与 Postgres 数据库进行交互。同时,我们还学习了如何使用 TypeScript 来增强我们接口的安全性和可读性。

代码示例:https://github.com/liuxinzzz/deno-rest-api/

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