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

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

概述

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


猜你喜欢

  • 使用 Immutable.js 管理 React 中的状态

    在 React 中,管理状态是非常重要的一项功能。在复杂的应用中,状态会变得越来越复杂,这会使得应用的性能受到影响。为了解决这个问题,我们可以使用 Immutable.js 管理 React 中的状态...

    11 天前
  • JavaScript ES9: 新特性深度分析

    JavaScript ES9(也称为 ECMAScript 2018)是 JavaScript 的最新版本。该版本在2018年6月发布,包含了一些新的特性。在本文中,我们将深度分析这些新特性,并提供示...

    11 天前
  • 实现自定义元素的动态属性及其应用

    简介 在前端开发中,我们通常需要自定义一些元素或者扩展一些元素的功能来满足项目需求。而有时候我们需要在页面中某个元素上添加一些特殊的属性来实现某些功能,这时候我们就需要实现自定义元素的动态属性。

    11 天前
  • Kubernetes 上部署 Node.js 应用的步骤详解

    Kubernetes 是一种流行的容器编排工具,可以自动化管理和部署容器化应用程序。在本文中,我们将讨论如何在 Kubernetes 上部署 Node.js 应用程序。

    11 天前
  • GraphQL 的查询语法及实例分析

    GraphQL是一种新型的API查询语言,它提供了一种更加高效、灵活和易于理解的动态API查询方法。与RESTful API相比,GraphQL相对灵活,可以针对任何类型的数据进行查询,并可以根据实际...

    11 天前
  • 如何在 Hapi 框架中使用 Angular.js

    在现代 Web 开发中,前端框架成为了必不可少的一部分。Angular.js 是一个非常流行的前端框架,而 Hapi 是一个强大的 Node.js 框架。本文将会指导你如何在 Hapi 中使用 Ang...

    11 天前
  • 解决 JavaScript Promise 中循环中止的问题

    在 JavaScript 中,Promise 是一种处理异步操作的方法,它使我们能够更有效地处理异步代码。然而,在循环中使用 Promise 时,可能会遇到一些问题,例如循环被中止或不按顺序执行。

    11 天前
  • 如何使用 LESS 预处理器实现复杂背景矢量图

    LESS 是一个 CSS 预处理器,它可以让我们用类似编程语言的方式来编写 CSS,使得 CSS 变得更加易于维护和管理。LESS 的主要特性是它支持变量、嵌套规则、运算和函数等高级特性,这些特性让我...

    11 天前
  • CSS Grid 自动调节网格布局的使用

    在前端开发中,网格布局是一种常用的布局方式之一。CSS Grid 是一种基于网格的布局系统,可以轻松创建复杂的布局,同时拥有灵活的响应式能力。本文将介绍如何使用 CSS Grid 中的 auto-fi...

    11 天前
  • 如何使用 ES2020 中的 BigInt 作为 MySQL 中的主键类型?

    在过去,MySQL 中常被用作主键的数据类型是 int 或 bigint,它们的取值范围分别为 -2^31 到 2^31-1 和 -2^63 到 2^63-1,而在 ES2020 中,我们引入了 Bi...

    11 天前
  • ES12 中如何使用可以为空的参数(Nullable Types)

    引言 随着前端技术的不断发展,新的语言特性也在不断涌现。其中,ES12 中的 Nullable Types 容许我们在定义函数参数时将其设为可选择的参数,可能为空值或非空值。

    11 天前
  • 如何使用 Koa 实现 OAuth2.0 的认证和授权?

    OAuth2.0 是一种流行的认证和授权协议,它允许用户使用第三方应用程序进行身份验证和授权。Koa 是一个流行的 Node.js Web 框架,它提供了一个简单而强大的中间件模型,使得开发 OAut...

    11 天前
  • Deno 如何进行进程管理

    简介 Deno 是一个基于 V8 引擎构建的安全 TypeScript 运行时环境。它提供了一种新的方式来编写 JavaScript 应用程序,很多开发者已经开始使用 Deno。

    11 天前
  • Sequelize 升级到 6.x 产生的问题分析及解决方案

    前言 Sequelize 是一个基于 Node.js 的 ORM(Object-Relational Mapping) 框架,它支持多种 SQL 数据库。最近,Sequelize 从 5.x 版本升级...

    11 天前
  • React 状态管理最佳实践 - React Context API

    在 React 开发中,状态管理是非常重要的部分。React 提供了一些方式来管理组件间的状态,例如 React Redux 和 MobX 等。不过,对于一些小型应用或独立组件而言,使用这些库会显得过...

    11 天前
  • 如何为数据可视化提供无障碍性

    在数据可视化过程中,我们通常会使用图表、地图和表格等视觉化工具来呈现数据,让用户更好地理解数据。但是,对于一些视力或听力障碍的用户来说,这些数据可视化技术可能会带来一些困难。

    11 天前
  • 如何使用 Jest 测试 Websocket 相关的代码

    本文将介绍如何使用 Jest 测试 WebSocket 相关的代码。WebSocket 是一个跨越传输层协议的标准,它可以在单个 TCP 连接上提供双向通信。由于它的高效性和可扩展性,WebSocke...

    11 天前
  • AngularFire2 手把手带你玩转 Firebase

    Firebase是一个由Google提供的云服务平台,目前已经成为开发者的首选之一。在前端技术中,AngularFire2是一个在Angular中使用Firebase的库。

    11 天前
  • 如何在 Django 项目中优雅地使用 Tailwind CSS?

    作为一名前端开发者,你可能已经听说过 Tailwind CSS,它是一个快速、低级别的 CSS 框架,允许你快速构建 UI 组件,并提供了丰富的样式类库。如果你的项目是使用 Django 构建的,那么...

    11 天前
  • Next.js + Styled Components 主题样式配置

    作为前端开发人员,我们经常需要处理样式和主题的问题。在这篇文章里,我们将探讨如何使用 Next.js 和 Styled Components 来配置主题样式,以及如何在我们的项目中实现主题样式的变换功...

    11 天前

相关推荐

    暂无文章