Fastify 和 PostgreSQL:快速构建 RESTful API 的最佳实践

概述

RESTful API 是 Web 应用中常用的一种架构风格,它提供了一种在不同应用程序之间通信的标准方式。Fastify 是一个开源的 Node.js Web 框架,它具有极快的性能、低内存消耗、丰富的插件生态和开发体验等优势。PostgreSQL 是一种关系型数据库,它提供了可靠的 ACID 事务、高级查询和扩展性等特性。在本篇文章中,我们将介绍如何使用 Fastify 和 PostgreSQL 快速构建 RESTful API 的最佳实践。

前置条件

在开始学习如何使用 Fastify 和 PostgreSQL 构建 RESTful API 前,你需要掌握以下内容:

  1. Node.js 的基础知识;
  2. 熟悉 JavaScript 的基础语法;
  3. 对 RESTful API 的基本概念和原则有一定了解。

建立项目

首先,我们需要创建一个基础的项目结构。你可以使用 Fastify CLI 来快速建立一个项目。

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

这个命令将在当前目录下创建一个名为 my-app 的项目,该项目包含了一些基础文件和目录。

接下来,我们需要安装一些必要的依赖。

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

这里我们添加了以下依赖:

  • fastify-sensible 提供常用的 Fastify 插件;
  • fastify-autocannon 用来压测我们构建的 API;
  • fastify-caching 提供 HTTP 缓存功能;
  • fastify-cors 提供 CORS 功能;
  • fastify-helmet 帮助保护 Web 应用免受各种攻击;
  • fastify-rate-limit 提供请求速率限制;
  • pg 是 PostgreSQL 的官方 Node.js 客户端,我们将用它来连接数据库。

建立数据库

在开始构建 API 之前,我们需要先建立一个数据库。你可以使用以下命令在 PostgreSQL 中创建名为 users 的数据库。

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

在这个数据库中,我们将保存用户信息。

创建表

接下来,我们需要在 users 数据库中创建一个名为 users 的表格。这个表格将包含以下字段:

  • id:用户 ID;
  • name:用户名称;
  • email:用户电子邮件地址;
  • password:用户密码;

我们可以使用以下命令为我们的数据库创建表格。

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

创建 RESTful API

现在我们已经建立了数据库和表格,可以开始构建 RESTful API 了。以下是我们将要构建的 API:

  • 获取所有用户
  • 获取指定 ID 的用户
  • 创建一个新用户
  • 更新指定 ID 的用户
  • 删除指定 ID 的用户

1. 获取所有用户

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

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

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

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

首先,我们需要连接数据库,并在 getUsers 函数中使用 SQL 查询语句选择数据库中表格所有用户记录。一旦查询成功,我们就可以将结果作为响应发送回客户端。

2. 获取指定 ID 的用户

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

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

这里我们接收 ID 固定的 URL 并使用 $1 作为参数化查询占位符,这可以使我们更容易地防范 SQL 注入攻击。如果用户不存在,我们将以 404 响应发送一个错误信息。

3. 创建一个新用户

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

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

这里我们从请求体中读取用户信息,并使用 INSERT 语句将新纪录插入数据库中。由于我们在 INSERT 语句中使用了 RETURNING *,因此我们可以获得插入的新纪录,并以 201 响应发送回客户端。

4. 更新指定 ID 的用户

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

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

这里我们使用 PUT 或 PATCH 请求来替换或更新指定 ID 的用户信息。我们使用 UPDATE 语句来更新数据库中的记录,再使用 RETURNING * 获取更新后的新纪录并发送给客户端。如果没有找到相应的记录,则以 404 响应发送错误信息。

5. 删除指定 ID 的用户

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

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

这里我们使用 DELETE 请求删除指定 ID 的用户信息,并使用 RETURNING * 获取删除后的新纪录并发送给客户端。如果没有找到相应的记录,则以 404 响应发送错误信息。

添加插件

为了增加 API 的功能性和健壮性,我们可以添加一些 Fastify 插件。如上文所述,我们已经在项目中安装了一些基本的插件,但我们还可以添加更多,这里以 fastify-redis 为例。

首先,我们需要安装该插件。

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

然后我们需要在服务器启动时绑定 Redis。我们将在应用程序中增加以下部分:

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

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

-------

现在,我们可以在服务器中通过 fastify.redis 访问 Redis 实例以执行一些操作。例如,我们可以使用以下代码将一个值保存到 Redis 中:

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

结论

现在我们已经成功地使用了 Fastify 和 PostgreSQL 构建了一个简单的 RESTful API,并添加了一些插件来增加功能性和健壮性。Fastify 和 PostgreSQL 提供了一个高效、灵活、扩展性强的解决方案来构建 Web 应用程序。

虽然本文章只是一个简单的,基础的示例,但它可以为你提供一些有用的指导,帮助你了解如何使用这些强大的技术来构建更完整、更复杂的 Web 应用程序。

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