使用 Express.js 构建 REST API 的最佳实践

随着移动互联网的迅猛发展,越来越多的企业和开发者开始将业务重心向前端技术转移。当前的前端技术极为丰富,其中最为流行的将是利用 JavaScript 语言开发的 Web 应用程序。而 Express.js 则是一款流行的用 JavaScript 语言编写的 Web 框架,它在 Node.js 上执行,让我们得以用 JavaScript 实现服务器端程序。本文将带领您领略使用 Express.js 构建 REST API 的最佳实践。

REST API 的基础知识

REST (Representational State Transfer) 是一个架构样式,与传统的 RPC 风格的 API 设计相比,更加基于 HTTP。RESTful API 是基于 REST 设计原则开发的 Web API。即,RESTful API 遵循了 HTTP 协议的特定方法,如 GET、POST、PUT、DELETE 等,并使用各种形式的数据传输,如 JSON(JavaScript Object Notation)、XML(Extensible Markup Language)或 YAML(YAML Ain't Markup Language)等。RESTful API 的标准使用 HTTP 状态代码以及超媒体,以通知使用者服务器的响应。

RESTful API 的设计原则有以下 6 个:

  1. 客户端-服务器分离。即将服务端与客户端解耦,这将使服务器更容易扩展。
  2. 状态无关性。客户端的每个请求应包含所有必要的信息,不应保存任何上下文信息在服务端。
  3. 缓存。服务器必须明确缓存数据以缩短响应时间。
  4. 统一接口。设计的 RESTful API 应该遵循统一接口的约束,从而让不同客户端遵循同样的API规范所提供的接口。
  5. 分层系统。 RESTful API 应该支持客户端和服务器之间的层级,以提高系统的可伸缩性。
  6. 按需代码抽象化。 RESTful API 设计应尽可能保存独立于低级实现详细信息的抽象层次。

接下来我们将利用这些原则考虑 Express.js REST API 的设计。

Express.js 中 REST API 的设计

我们将根据上述 RESTful 设计原则和 Node.js/Express.js 范例设计 RESTful API。通常,我们会将所有 API 的端点都放在 /api 下,如 /api/user/api/product,这也很符合解耦的基本原则。

安装与使用 Express.js

首先,我们需要安装 Node.js 和 Express.js。打开命令行,输入以下命令:

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

之后,在目录 myapp 下创建文件 index.js。在 index.js 中引入 Express.js 模块并创建一个 app 实例。

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

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

创建 REST API 端点

/api 下,我们需要创建不同的端点,如 /api/user/api/product 等。我们可以使用 /api 控制器创建这些不同的端点,如下所示:

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

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

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

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

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

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

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

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

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

此时,我们已经创建了 /api/user 下的所有端点。其中,GET 方法用于获取数据,POST 方法用于创建新数据,PUT 方法用于更新数据,DELETE 方法用于删除数据。其中,/api/user/:id 是一个动态路由,根据不同的请求参数就可以返回不同的数据。

数据库的集成

数据库的集成是复杂和重要的一步骤,这需要根据您当前业务的技术架构和需求选择数据库类型和技术。在这里,我们使用 MongoDB 数据库和 Mongoose.js 库作为示例演示。MongoDB 是一种非关系型数据库,使用 JavaScript 对象表示数据,而 Mongoose.js 可以将 MongoDB 对象转成 JavaScript 对象。因此,我们需要先安装 Mongoose.js 库。

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

对于使用 MongoDB 的 API,我们只需在 /api/user 下使用 Mongoose 模型来代换掉之前的静态方式即可。下面是一个示例:

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

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

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

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

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

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

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

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

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

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

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

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

上述代码中,我们首先定义了数据库连接,并创建了 Mongoose 模型。然后,在我们的 API 控制器中,我们通过上述 Mongoose 模型查询、插入、更新和删除用户数据。在每个 route 中使用了回调函数,因为这些操作都是异步的。

身份验证与授权

身份验证和授权是现代 Web 应用最重要的安全措施。在 Express.js 中,我们有多种方式实现它。

基于 Token 的身份验证

Token 作为客户端的认证信息,在许多现代 Web 应用程序中普遍使用。这种认证方式很简单,它在服务器端验证用户输入的用户名和密码,并分配一个包含用户信息的 JSON Web Tokens(JWT)。之后,每个客户端在每个请求上将用户 JWT 发送到服务器,并在响应后作为铜纸进行请求。下面是一个示例:

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

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

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

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

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

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

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

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

上述示例代码中,我们定义了 POST 方法 api/login 和 GET 方法 api/adminapi/login 请求时将从请求体中提取 usernamepassword,如果是有效的管理员账号,将返回有效的 JWT。在 api/admin 控制器方法中,我们将使用 verifyToken 中间件来验证 JWT。当客户端请求进入 api/admin 方法时,它的 header 中将包含由服务器签名的 JWT,jwt.verify 能够对此进行验证。如果 JWT 有效,请求将被允许。否则,请求将被拒绝。

结论

在本文中,我们描述了如何使用 Express.js 构建 REST API。您可以学习如何利用 Express.js 创建 RESTful API,充分利用 MongoDB 和 Mongoose.js 在您的 API 中进行数据存储操作,以及如何使用身份验证和授权,加强您的 API 安全性。我们相信这篇文章将帮助您开始编写强大、高适应性并且安全的 Express.js REST API。

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