前言
Deno 是一个以安全、现代化、稳定等特点为标志的 JavaScript/TypeScript 运行时环境,不仅有着 Chrome V8 引擎的高性能执行能力,还内置了网络请求、文件操作等各种常用 API,并采用了单线程、异步、事件驱动等技术架构使其更适合于高并发、高性能、高安全的网络开发。
本文将介绍如何使用 Deno 搭建 Restful API,以及使用 TypeScript 增强接口的安全性和可读性。
准备工作
在本文中,我们将使用 oak
和 denon
作为搭建 restful API 的主要工具。
oak
是一个基于 Deno 开发的中间件框架,支持各种中间件和路由功能,可以帮助我们轻松地构建 API 接口。
denon
则是 Deno 中的一个文件变化监视工具,可以监听文件变化,自动重启服务,以减少我们的开发时间和工作量。
这里我们使用如下命令安装以上两个工具:
---- ------- ---------- ------------ ----------- ------------- -- ----- ----------------------------------
---- ------- ----------- ------------ ------------------------------
搭建 API
首先,我们需要创建一个工作目录,以示例中的 deno-rest-api
为例:
----- ------------- -- -- -------------
然后,我们创建一个名为 src
的文件夹来存放源代码,并在该文件夹中创建一个名为 app.ts
的文件。该文件将作为我们 API 的入口文件。
接下来,我们将简单构建一些路由功能,并使用 oak 系统。
在 app.ts 中,我们引入需要使用的 oak
和 dotenv
:
------ - ------------ ------ - ---- --------------------------------- ------ - ------ - ---- ------------------------------------
我们在 API 的入口文件中初始化一个应用,并设置路由:
----- --- - --- -------------- ----- ------ - --- --------- --------------- ----- -- - ----------------- - ------ ------- --- ------------------------- ---------------------------------
上述代码中,我们创建了一个新的应用(app
)和一个新的路由(router
),并定义了一个 GET
请求。
对于 /
路由,返回 Hello Deno!
字符串。接下来,我们将使用 dotenv 来设置我们的端口:
------------------------------ -- --------- ---- -- -- - ---------------------- -- ---------------------- --- ----- ----------------------------------------------------
最后,我们在项目根目录下创建 .env
文件,并添加以下内容:
--------- ------------------
接下来我们就可以使用以下命令来启动我们的服务:
----- --- ------- ----------- ------------ ------
若启动成功,在我们的服务监听到 HOSTNAME
和 PORT
指向的地址时,它将显示 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_HOST
、PG_PORT
、PG_USER
、PG_PASSWORD
和 PG_DB
,这些变量来自于 .env
文件,可以自行选择更改。
接下来,我们定义了 executeQuery
函数,它将执行传递到它的 SQL 查询,并将结果转换为对象数组。
最后,我们定义了 getAllPersons
、addPerson
和 deletePerson
等函数,用于与数据库进行交互。
接下来,我们在 app.ts
文件中加入新路由管理方式,使其能够通过 API 访问上述函数:
----- ------ - --- --------- --------------- ----- -- - ----------------- - ------ ------- --- ---------------------- ----- ----- -- - ----------------- - ----- ---------------- --- ---------------------- ----- ----- -- - ----- - ---- - - ----- ------------------------- ----------------- - ----- ---------------- --- ---------------------------- ----- -- ------- -------- -- -- - ----- - -- - - ------- ----- --------------------------- --------------- - ---- --- ------------------------- ---------------------------------
最终,我们的 API 现在支持通过以下路径访问 Postgres 数据库:
----------------------------- ---------------------------- --------------------------------
使用 TypeScript 增强接口的安全性和可读性
TypeScript 是一种由 Microsoft 开发的开源编程语言,它是 JavaScript 的超集,可以在 JavaScript 中为变量和函数添加类型注释。在数据类型存储、函数调用等方面提供了极大的帮助。
在我们的例子中,我们可以通过 TypeScript 来增强我们的 API 接口的可读性和安全性。需要先安装 types
和 tsconfig.json
:
---- ------- ---------- ------------ ----------- ------------- -- ----------- --------------------------------------
----- -------------
在 tsconfig.json
文件中添加以下代码:
- ------------------ - ------------------ ----- --------- ----------- --------- ------- --------- ----- --------- -------- -- ---------- ---------------- ---------- ---------------------- -
在app.ts
中,我们可以创建一个名为 Person
的接口,它负责定义我们从 Postgres 数据库返回的对象结构:
--------- ------ - --- ------- ----- ------- -
现在,我们可以使用 Person
接口来增加对我们接口的客户端开发者的可读性和安全性。我们可以使用 Person
接口来强制类型定义所有与数据库工作的函数。
----- ------------ - ----- ---------- ------- -------- ------- ------------ -- - --- - ----- ------ - ----- ---------------------------- --------- ------ ------------ - ----- ------- - ------------------- ------ --- - -- ----- ------------- - ----- --- ----------------- -- ---------------------------- - ---- ---------- ----- --------- - ----- ------ -------- --------------- -- ---------------------------- ---- ------- ------ ------ ---- --------- --- --------- ----- ------------ - ----- ---- -------- ------------- -- -------------------------- ---- ------- ----- -- - -- --------- --- ----
在上述代码中,我们使用了类似于 executeQuery
的方法,但它增加了泛型类型的支持。现在,我们可以为所有类型添加显式的函数签名,以避免对类型的错误推断或强制类型定义。
从而得出如下错误提示:
----- ------- -------- -- ---- -------------- -- --- ---------- -- --------- -- ---- ---------------------------- ---- -------------- -- --- ---------- -- ---- ---------------------------- ----- -- -------- ------ --- ------------- ---- --------------- ----- -- --- ---------- -- ---- --------- -- ----- --------- - --------------------------- -----------
这样,我们就可以使用 TypeScript 增加我们接口的可读性和安全性。
结论
本文我们了解了如何使用 Deno 和 TypeScript 构建 Restful API。我们从学习一些基本概念开始,到学习如何使用 oak
和 denon
创建路由接口,从而与 Postgres 数据库进行交互。同时,我们还学习了如何使用 TypeScript
来增强我们接口的安全性和可读性。
代码示例:https://github.com/liuxinzzz/deno-rest-api/
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/673404ec0bc820c58245d852