使用 Hapi.js 与 PostgreSQL 实现 Node.js 数据库操作

什么是 Hapi.js 和 PostgreSQL?

在介绍如何使用 Hapi.js 和 PostgreSQL 实现 Node.js 数据库操作之前,先来简单介绍一下 Hapi.js 和 PostgreSQL。

Hapi.js

Hapi.js 是一个 Node.js Web 开发框架,旨在提供可靠的、稳定的 Web 应用程序和 API 的构建工具。Hapi.js 提供了可扩展的路由、处理程序、插件架构和大量的内置插件。

PostgreSQL

PostgreSQL 是一个开源的、完全符合 ACID 的关系型数据库系统。它拥有高可靠性、高可扩展性、高性能、安全性强等优点,被广泛应用于各种规模的企业级应用程序。

如何使用 Hapi.js 和 PostgreSQL 实现 Node.js 数据库操作?

现在我们来看一下如何使用 Hapi.js 和 PostgreSQL 实现 Node.js 数据库操作。在本文中,我们将创建一个简单的 API,该 API 具有以下功能:

  • 查找指定用户 ID 的用户信息。
  • 添加用户信息。
  • 更新指定用户 ID 的用户信息。
  • 删除指定用户 ID 的用户信息。

步骤一:安装依赖

首先,我们需要安装一些依赖包。在命令行中输入以下命令:

--- ------- ---- -- --- -------
  • hapi:用于创建 Web 应用程序。
  • pg:用于连接 PostgreSQL 数据库。
  • joi:用于验证数据。
  • nodemon:用于监视代码更改并自动重新启动服务器。

步骤二:创建数据库

接下来,我们需要在 PostgreSQL 数据库中创建一个名为“users”的表,该表具有以下列:

  • id:整数类型,主键,自动递增。
  • name:字符串类型,要求非空。
  • age:整数类型,要求非空。

可以使用以下 SQL 语句创建该表:

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

步骤三:初始化 Hapi.js 应用程序

现在我们开始编写代码。首先,创建一个名为“server.js”的文件,并初始化 Hapi.js 应用程序。

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

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

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

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

--------

在此代码中,我们创建了一个名为“server”的对象,该对象表示我们的应用程序。我们使用 Hapi.server() 方法初始化该对象,并指定监听的端口号。

然后,我们定义了一个名为“/”的路由,用于测试服务器是否正常运行。该路由使用 requesth 参数,并返回“Hello World!”作为响应。

最后,我们使用 start() 方法启动服务器,并在控制台日志中打印服务器 URL。

运行以下命令启动服务器:

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

如果一切正常,应该在控制台中看到以下消息:“Server running at: http://localhost:3000”。

步骤四:连接到 PostgreSQL 数据库

接下来,我们需要连接到 PostgreSQL 数据库。我们将使用 pg 包提供的 Pool 对象来建立连接池。

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

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

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

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

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

在此代码中,我们使用 pg 包提供的 Pool 对象创建连接池,并指定连接到的数据库和凭据。

然后,我们使用 on() 方法为连接池添加错误处理程序。如果在空闲客户端上发生预料外的错误,我们将记录该错误并终止进程。

最后,我们定义了一个名为 getUsers() 的异步方法,该方法查询“users”表中的所有行,并返回结果。

注意,在此代码中,我们调用了 console.log('PostgreSQL connected!'),以确保我们已成功连接到 PostgreSQL 数据库。

步骤五:添加路由

现在,我们已经成功连接到 PostgreSQL 数据库,并且可以查询用户的信息了。接下来,我们需要添加一些路由,允许我们执行 CRUD 操作。

  • 查找指定用户 ID 的用户信息:
--------------
  ------- ------
  ----- --------------
  -------- ----- --------- -- -- -
    ----- - ---- - - ----- -----------
      ------- - ---- ----- ----- -- - ----
      -------------------
    --

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

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

在此代码中,我们定义了一个名为“/users/{id}”的路由,可以查找具有指定 ID 的用户信息。

首先,我们使用 $1 占位符创建了一个参数化 SQL 查询,该查询将通过 request.params.id 中的 ID 值进行筛选。然后,我们使用异步方法 pool.query() 执行查询,并将结果赋值给 rows 变量。

接下来,如果结果集的 length 属性为 0,说明没有找到符合条件的用户,我们将返回 h.response('User not found').code(404),即“用户未找到”的 404 错误响应。

否则,我们返回结果集的第一行,即具有此 ID 的用户信息。

  • 添加用户信息:
----- ---------------- - ------------
  ----- ------------------------
  ---- ----------------------------------
---

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

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

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

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

在此代码中,我们定义了一个名为“/users”的路由,可以添加用户信息。

首先,我们使用 Joi 包创建了一个名为 createUserSchema 的对象,用于验证 nameage 字段的有效性。如果其中任何一个字段无效,我们将返回 400 错误响应。

接下来,我们从 request.payload 中获取 nameage 的值,并使用参数化 SQL 查询将它们插入到 users 表中。(注意,为了获取新插入的行,我们使用 RETURNING * 子句。)

最后,我们返回新插入的行。

  • 更新指定用户 ID 的用户信息:
----- ---------------- - ------------
  ----- -------------
  ---- -----------------------
---

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

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

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

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

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

在此代码中,我们定义了一个名为“/users/{id}”的路由,用于更新具有指定 ID 的用户信息。

首先,我们使用 Joi 包创建了一个名为 updateUserSchema 的对象,用于验证 nameage 字段的有效性。如果其中任何一个字段无效,我们将返回 400 错误响应。

接下来,我们从 request.payload 中获取更新后的 nameage 的值,并使用参数化 SQL 查询更新 users 表中具有指定 ID 的行。

如果没有行受到更新,我们将返回 404 错误响应。否则,我们将返回受更新影响的行。

  • 删除指定用户 ID 的用户信息:
--------------
  ------- ---------
  ----- --------------
  -------- ----- --------- -- -- -
    ----- - ---- - - ----- -----------
      ------- ---- ----- ----- -- - -- --------- ---
      -------------------
    --

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

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

在此代码中,我们定义了一个名为“/users/{id}”的路由,用于删除具有指定 ID 的用户信息。

使用参数化 SQL 查询删除 users 表中具有指定 ID 的行。如果没有行受到删除,我们将返回 404 错误响应。否则,我们将返回受删除影响的行。

步骤六:测试 API

现在,我们已经创建了 API 的基本框架,允许我们执行 CRUD 操作。我们可以使用 Postman 或类似的工具测试这些路由,并在数据库中查看结果。

例如,可以使用以下 JSON 对象测试添加用户信息:

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

或者,可以使用以下 JSON 对象测试更新用户信息:

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

或者,可以使用以下 URL 测试查找用户信息:

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

或者,可以使用以下 URL 测试删除用户信息:

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

总结

在本文中,我们使用 Hapi.js 和 PostgreSQL 创建了一个简单的 CRUD API。我们了解了如何连接到 PostgreSQL 数据库,如何使用 Hapi.js 添加路由,以及如何执行查询和写入操作。我们还了解了路由验证和错误处理的基础知识,以及如何使用 Postman 测试 API。

使用 Hapi.js 和 PostgreSQL 可以实现可靠的、稳定的 Web 应用程序和 API 的构建工具。通过使用这些工具,您可以创建出具有高可靠性、高可扩展性、高性能、安全性强等优点的企业级应用程序。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6494223e48841e98941a7807


猜你喜欢

  • Jest + Puppeteer 测试 Vue SSR 项目

    随着前端技术的不断发展,Vue SSR(服务器端渲染)已经被广泛应用于实现更快的首次加载和更友好的 SEO,但同时也带来了新的测试问题。在 SSR 环境下,前端和后端的界限变得模糊,如何进行有效的测试...

    1 年前
  • 无障碍设计在国际化贸易中的影响与优化

    随着全球贸易的逐渐发展,越来越多的企业涉足到跨国业务和国际化市场中。在这个背景下,无障碍设计成为了一个越来越重要的话题。本文,我们将会从无障碍设计的基础入手,探讨无障碍设计在国际化贸易中的影响与优化,...

    1 年前
  • 如何使用 Hapi.js 和 Redis 实现会话管理

    随着 Web 应用程序的增长和用户交互的增加,许多应用程序需要管理会话以在多个请求之间跟踪用户状态。要做到这一点,Hapi.js 作为流行的 Node.js Web 框架提供了内置的会话管理功能。

    1 年前
  • 如何使用 Babel 进行代码分析和调试

    本文将介绍如何使用 Babel 进行前端代码分析和调试,包括代码转换和语法检查等功能。 什么是 Babel Babel 是一个 JavaScript 编译器,可以将 ES6+ 代码编译成 ES5 或更...

    1 年前
  • ES7 中关于 Rest 参数的新特性及应用

    在 ES6 中,我们已经认识到了“剩余参数”的概念,即使用 Rest 参数将多个函数参数转换成一个数组。而在 ES7 中,Rest 参数又有了新的应用和特性。 Rest 参数的基础用法 首先,我们来回...

    1 年前
  • 了解 ES11 中的 globalThis 全局变量,解决 JavaScript 中不同环境代码兼容性问题

    在编写 JavaScript 代码时,我们经常会面对不同环境导致的兼容性问题。例如,在浏览器中使用 window 对象来访问全局变量,但在 Node.js 环境中,却应该使用 global 对象。

    1 年前
  • 如何使用 Tailwind CSS 实现圆角、阴影等效果

    简介 Tailwind 是一个基于原子类的 CSS 框架,使用非常简便,只需要在 HTML 标记中加入 Tailwind 提供的 CSS 类名即可实现各种布局和样式效果。

    1 年前
  • React Native 中使用 ImagePicker 实现图片选择

    作为一款跨平台移动应用程序框架,React Native 在移动应用的开发中具有广泛的应用。其中,对于图片选择的功能,在移动应用的开发中也是非常常见的需求。 React Native 提供了 Imag...

    1 年前
  • Koa2 实现 WebSocket 详解

    简介 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,使得客户端和服务器可以进行实时通信。Koa2 是一个优秀的 Node.js web 开发框架,可以方便地使用中间件实现 We...

    1 年前
  • ES10 中的 Object.fromEntries 方法实现简单的二维数组转对象

    在前端开发中,我们经常要对不同类型的数据进行转换操作。其中,将二维数组转换成对象是常见的操作之一。在 ECMAScript 2019 标准(ES10)中,新加入的 Object.fromEntries...

    1 年前
  • 关于简单的 sequelize 表单的应用 =================================

    关于简单的 Sequelize 表单的应用 Sequelize 是一款基于 Node.js 的 ORM 框架,用于操作关系型数据库。它具有易用、强大、智能化的特点,是现今前端开发中十分流行的一个技术。

    1 年前
  • RxJS 中的 Of,Timer,fromEvent 等使用方法详解

    RxJS 是一个强大的库,它提供了丰富的操作符和工具,使得我们能够更加容易地处理数据流。在 RxJS 中,Of,Timer 和 fromEvent 是一些常用的操作符,它们在处理数据流时十分有用。

    1 年前
  • Mongoose 中的文档嵌套查询方法

    Mongoose 是一个流行的 Node.js ORM 框架,它允许您在 Node.js 应用程序中使用 MongoDB 数据库。 Mongoose 提供了许多方法来处理数据和查询。

    1 年前
  • 使用 Angular 和 Express 构建 RESTful API

    前言 REST(Representational State Transfer)是一种用于构建应用程序的架构风格。RESTful API 使用 HTTP 协议进行通信,使用轻量级、可维护和灵活的方式实...

    1 年前
  • 小清新 Promise 打造异步流程控制方案

    Javascript 是一门非常重要的语言,在网页开发中占据着无法替代的地位。然而,Javascript 语言中有很多异步操作,而这些异步操作往往需要处理复杂的流程控制。

    1 年前
  • SASS 中数据类型的使用和转换技巧分享

    SASS 是一种 CSS 预处理器,它引入了变量、嵌套规则、混合、继承等功能。SASS 中不仅支持原始的 CSS 数据类型,还引入了一些新的数据类型。本文将介绍 SASS 中数据类型的使用和转换技巧,...

    1 年前
  • 利用 CSS Grid 打造吸附式布局

    CSS Grid 是目前最先进和最强大的 CSS 布局系统之一。它能够让我们轻松实现各种复杂的布局,包括用于响应式设计的自适应和自适应布局、吸附式布局等等。在本文中,我们将深入探讨如何利用 CSS G...

    1 年前
  • 如何在 Custom Elements 中实现 DOM 操作的最佳实践

    Custom Elements 是 Web Components 的一部分,它提供了一种在浏览器中定义新的 HTML 标签的方法。它允许开发者在不与其他代码发生冲突的情况下创建新的 HTML 元素,从...

    1 年前
  • ES6语法带来的性能提升及其在实际场景中的应用

    ES6是JavaScript的一个重要版本,它引入了许多新特性和语法糖,这些有助于提高代码的可读性、可维护性和性能。本文将主要介绍ES6语法带来的性能提升,并且提供一些实际场景的应用示例和指导意义。

    1 年前
  • SPA 应用中 SEO 技巧分享(利用预渲染技术)

    单页应用(SPA)目前已经成为前端开发的热门技术。但是 SPA 存在一个严重的问题:不利于搜索引擎优化(SEO)。因为 SPA 只有一个 HTML 文件,页面的内容都在 JavaScript 中渲染,...

    1 年前

相关推荐

    暂无文章