使用 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


猜你喜欢

  • Angular 中如何使用 OpenLayers 地图库进行地图应用开发

    简介 Angular 是一款流行的前端框架,其能更好地组织代码、管理依赖、提供丰富的扩展等优势,越来越多的工程师开始抛弃传统地图开发方式,将地图应用与 Angular 框架结合。

    5 天前
  • ES11 新特性:BigInt 精确数字类型

    在过去的 JavaScript 中,数字类型只能表示从 -2^53 到 2^53 范围内的整数,而对于更大的数字需使用第三方库进行处理。为了解决这个问题,ECMAScript 2020(也称为 ES1...

    5 天前
  • 利用 Enzyme 测试 React 组件的正确方式

    React 是一种流行的 JavaScript 库,可以帮助开发者构建复杂的 Web 应用程序。以 React 为例,它是一种基于组件的开发方式,组件是应用程序的构建快照,组件可以重复使用。

    5 天前
  • 如何使用 Headless CMS 构建在线教育平台的内容管理系统

    前言 在线教育平台是近年来蓬勃发展的行业之一,很多企业和机构都在开发和使用自己的在线教育平台。为了让教学内容能够更加有效地被传达,内容管理系统是必不可少的一部分。 传统的 CMS 存在一些问题,比如界...

    5 天前
  • 利用 GraphQL 开发即时通讯系统的指南

    随着互联网和移动设备的普及,即时通讯系统成为了人们日常生活中必不可少的一部分。对于前端开发者来说,如何利用好现有的技术来开发高效稳定的即时通讯系统成为了一个重要的问题。

    5 天前
  • React SPA 中如何优雅的进行异步数据加载

    React SPA 中如何优雅的进行异步数据加载 React 是一个流行的 JavaScript 库,它可以帮助您构建交互式、动态的用户界面。在 React SPA(单页应用)中,异步数据加载是非常重...

    5 天前
  • Vue.js 应用如何进行单元测试?

    Vue.js 是一个流行的前端框架,它允许我们快速构建 SPA(Single-Page Application),优秀的组件化和可测试性是 Vue.js 尤为吸引开发者的特性之一。

    5 天前
  • 使用 SASS 优化 CSS 代码的常用技巧

    SASS 是一种 CSS 预处理器,它可以让前端开发者更加方便地编写 CSS 代码。相比原生 CSS 语法,SASS 支持变量、嵌套、继承、混入等特性,让 CSS 代码更加模块化、可读性更强、可维护性...

    5 天前
  • Serverless 应用中如何应对密集请求的挑战?

    对于 Serverless 应用来说,面对密集的请求可能会导致高并发和运行时错误,特别是当这些请求需要在短时间内完成非常复杂的任务时。本文将介绍一些应对 Serverless 应用中密集请求的挑战的最...

    5 天前
  • PNG、JPEG、GIF 图片优化技巧

    在网站开发中,图片是不可或缺的一部分。然而,不同类型的图片所占用的空间以及网络加载速度是不一样的。本文将介绍 PNG、JPEG、GIF 三种常见图片格式的优化技巧,让你在图片显示效果与网站加载速度之间...

    5 天前
  • Angular 中使用 Mapbox 地图插件实现交互式地图

    前言 在现代 Web 开发中,地图数据的应用越来越广泛。交互式地图可以帮助用户更好地理解地理位置,找到所需的信息。 Mapbox 是一种开源的地图插件,它提供了许多方便的工具和 API,可以帮助开发者...

    5 天前
  • Fastify 应用程序中的图片上传教程

    对于一个网站来说,图片是必不可少的元素。在 Web 应用程序中,上传图片还经常是用户和服务器之间交流的核心部分之一。Fastify 是 Node.js 的一个快速和低开销的开源 Web 应用程序框架。

    5 天前
  • Headless CMS如何处理媒体资源管理和CDN分发

    在现代web应用程序中,Headless CMS变得越来越流行。Headless CMS主要是将内容管理与界面分离,使得前后端开发可以独立工作。它们通过API提供内容,这样开发人员可以将内容提供给任何...

    5 天前
  • Redis 使用技巧:如何高效地进行批量操作

    在前端开发中,Redis 是一款被广泛使用的缓存数据库。虽然 Redis 有着良好的性能和速度,但在进行批量操作时,仍然需要注意一些技巧和优化策略,以达到更高效的效果。

    5 天前
  • 用 Koa.js 构建基于 OAuth2 的 API

    在现代的前端开发中,使用 API 来获取数据已变得非常流行。而 OAuth2 是一个用于授权的开放标准,也是构建安全稳定的 API 的核心组成部分之一。本文将详细介绍如何使用 Koa.js 框架构建基...

    5 天前
  • GraphQL 中的缓存技巧详解

    在移动应用和 Web 应用的开发中,前端状态管理和网络数据请求常常涉及到缓存问题。GraphQL 是一种出色的数据查询语言(query language),不仅能提高网络请求效率,还能减少不必要的数据...

    5 天前
  • ES12 中的空值合并运算符详解

    在 JavaScript 中,对于未定义、 null 和空字符串等空值所涉及到的处理,一度令开发者头疼不已。为了解决这个问题,ES12 中引入了空值合并运算符,可以方便地处理这些空值。

    5 天前
  • 在 JavaScript 单元测试中使用 Chai.js 的 Should 风格断言

    单元测试是前端开发过程中不可或缺的一环,它可以帮助我们验证代码的正确性和可靠性。而断言库是实现单元测试的关键,它提供了一种对于预期结果的表述。Chai.js 是一个常见的 JavaScript 断言库...

    5 天前
  • 用户体验设计之最佳 Web 无障碍实践

    随着互联网的广泛应用,网站和应用程序的访问者日益增加,其中不乏身体残疾或智力残疾的人群。为此,无障碍设计成为 Web 开发中不可或缺的一部分,即为用户体验提供真正的普及性。

    5 天前
  • 如何使用 PM2 进行单元和集成测试?

    随着前端项目规模的不断扩大,测试已经成为了保证代码质量和可维护性的重要环节。使用 PM2 进行单元和集成测试可以有效提高测试效率和全面性。下面将详细介绍 PM2 的使用方法。

    5 天前

相关推荐

    暂无文章