前言
在现代互联网应用中,前端和后端都必不可少。而前端工程师也要掌握一定的后端技能,才能更好地协同开发。本文将介绍如何使用 Hapi.js 和 PostgreSQL 创建一个集合的 Web 应用。通过本文的学习,可以更好地理解前端和后端的协同工作。
Hapi.js 简介
Hapi.js 是一个用于构建 Web 应用程序的框架。它建立在 Node.js 上并使用可插拔模块系统,使开发人员可以使用各种插件。此外,Hapi.js 还内置了有用的功能,例如路由、输入验证和缓存管理,可以大大简化 Web 应用程序的开发。
PostgreSQL 简介
PostgreSQL 是一种开源关系型数据库管理系统,它被广泛用于 Web 应用程序的数据存储和管理。与 MySQL 不同,PostgreSQL 支持许多高级特性,例如事务和多版本并发控制(MVCC)。这使得 PostgreSQL 在应用程序需要高性能、高容错性和数据完整性的情况下得以广泛使用。
Hapi.js 与 PostgreSQL 的集成
下面将介绍如何使用 Hapi.js 和 PostgreSQL 设置 Web 应用程序,并使用 Sequelize 实现 ORM。以下是本教程的目标:
- 使用 Hapi.js 创建 Web 服务器
- 使用 PostgreSQL 创建数据库
- 使用 Sequelize 设计数据库模型
- 将 Sequelize 与 PostgreSQL 集成
- 在 Hapi.js 应用程序中使用 Sequelize
使用 Hapi.js 创建 Web 服务器
首先,我们需要安装 Hapi.js 和一些其他依赖项,例如 dotenv 和 joi:
npm install hapi dotenv joi --save
接下来,创建一个新的 server.js 文件并添加以下代码:
-- -------------------- ---- ------- --------------------------- ----- ---- - ---------------- ----- ------ - ------------- ----- ---------------- -- ----- ----- ---------------- -- ------------ --- ----- ---- - ----- -- -- - ----- --------------- ------------------- ------- --- --------------------- - -------------------------------- ----- -- - ----------------- ---------------- --- -------
这个文件是我们的应用程序的入口点。我们在其中使用 dotenv 和 joi 库。dotenv 是一个 npm 包,用于从 .env 文件中读取环境变量,并将其放入 Node.js 的环境变量中。这样做的好处是,我们可以将敏感信息,例如数据库密码,存储在 .env 文件中,而不必将它们直接存储在代码库中。
我们还使用 joi 库,它允许我们定义和验证输入数据的结构。我们将在后面的代码中看到 joi 的使用方式。
注意,在上面的代码中,我们创建了一个名为 server 的 Hapi 服务器对象。我们还定义了服务器默认端口和主机。如果未定义端口和主机,则默认使用端口号 3000 和本地主机。在启动服务器之前,我们还定义了一个 init 函数,该函数在服务器启动时被调用。我们在这个函数中打印一条消息,表示服务器已正在运行。
最后,我们还允许捕获未处理拒绝事件,以防止服务器发送未处理的错误消息。
使用 PostgreSQL 创建数据库
接下来,我们将创建一个名为 hapidemo 的 PostgreSQL 数据库。在本教程中,我们将使用 PostgreSQL 作为我们的默认数据库。我们可以使用以下命令在我们的本地计算机上安装和运行 PostgreSQL:
$ brew install postgresql $ brew services start postgresql
在安装和启动完毕后,我们需要用以下命令进入 PostgreSQL 控制台:
$ psql postgres
在控制台里面创建数据库:
CREATE DATABASE hapidemo;
创建完成后,我们可以使用以下命令退出 PostgreSQL 控制台:
\q
使用 Sequelize 设计数据库模型
数据模型是我们在数据库中存储数据的方式。在 Hapi.js 应用程序中,我们可以使用 Sequelize 库来创建数据模型。Sequelize 是一个 ORM(对象关系映射),它使我们能够使用 JavaScript 对象来描述数据库表。Sequelize 将这些对象自动映射到数据库表中的列,从而简化了数据库访问。
首先,我们需要安装 Sequelize 和一些其他依赖项:
npm install sequelize pg --save
我们可以看到,我们还安装了 pg 包。它是一个 PostgreSQL 驱动程序,Sequelize 使用它来与 PostgreSQL 进行通信。
接下来,我们来定义一个 Todo 数据模型。在 server.js 文件前面添加以下代码:
-- -------------------- ---- ------- ----- --------- - --------------------- ----- --------- - --- --------------------- ----- ----- - ----- ------------------- -- ------------ -------- ----------- ----------------- ------ --- ----- ---- - ------------------------ - --- - ----- ------------------ -------------- ----- ----------- ---- -- ------ - ----- ----------------- ---------- ------ --------- - --------- ----- - -- ---------- - ----- ------------------ ---------- ------ ------------- ----- - --- ----------- -------- -- ------------------ ------- --------------- ---------- -- ------------------ ----- -------- ------ -- ------ -------------- - -----
在上面的代码中,我们首先实例化了一个 Sequelize 对象,该对象与 PostgreSQL 数据库通信。我们还定义了一个名为 Todo 的模型,该模型将作为我们应用程序中的“TODO”列表。 Todo 的模型定义为:
- id:一个自增长的整数,用作主键
- title:一个必填字符串,用作 Todo 的标题。
- completed:一个布尔值,用于表示签入 Todo 是否已经完成。
Sequelize 将自动创建名为 todos 的表,并在其中存储 Todo 模型。
最后,我们调用 sync 函数,该函数将在数据库中创建名为 todo 的表。如果该表已经存在,则 sync 不执行任何操作。我们还将 Todo 导出为模块,以便在我们的应用程序的其他地方使用。
将 Sequelize 与 PostgreSQL 集成
我们现在已经有了一个 Todo 数据模型,并希望将其存储在 PostgreSQL 数据库中。我们需要配置 Sequelize 与 PostgreSQL 进行通信。在 server.js 文件中添加以下代码:
-- -------------------- ---- ------- ----- --------- - --- --------------------- -------------------- ------------------------ - ----- ------------------- -- ------------ -------- ----------- ----------------- ------ --- ------------------------ -------- -- - ----------------------- --- ---- ----------- ---------------- -- ---------- -- - --------------------- -- ------- -- --- ----------- ----- ---
在上面的代码中,我们更新之前的代码,将数据库的用户名和密码传递给 Sequelize 构造函数。我们还使用 authenticate 函数测试与数据库的连接是否正常。如果连接处于正常状态,则输出一条消息。
注意,我们还使用了 process.env.DB_USER 和 process.env.DB_PASSWORD。这些是我们为 PostgreSQL 数据库设置的环境变量。我们可以使用 .env 文件来保存它们:
DB_USER=postgres DB_PASSWORD=postgres DB_HOST=localhost
当我们运行应用程序时,dotenv 库将从 .env 文件中加载这些环境变量。这样做可以有效地避免硬编码数据库密码。
在 Hapi.js 应用程序中使用 Sequelize
我们现在已经可以使用 Sequelize 和 PostgreSQL 存储 Todo 数据。接下来,我们需要将 Todo 存储在我们的应用程序中。
在 server.js 文件中添加以下代码:
-- -------------------- ---- ------- ----- ---- - ------------------------- -------------- ------- ------ ----- --------- -------- ----- --------- -- -- - ------ ----- --------------- -- --- -------------- ------- ------- ----- --------- -------- ----- --------- -- -- - ----- - ----- - - ---------------- ----- ---- - ----- ------------- ----- --- ------ ----- -- --- -------------- ------- ------ ----- -------------- -------- ----- --------- -- -- - ----- - -- - - --------------- ----- - ------ --------- - - ---------------- ----- ---- - ----- -------------- ------ - -- - --- ----- ------------- ------ --------- --- ------ ----- -- --- -------------- ------- --------- ----- -------------- -------- ----- --------- -- -- - ----- - -- - - --------------- ----- ---- - ----- -------------- ------ - -- - --- ----- --------------- ------ - -------- -------- -------------- -- -- ---
在上面的代码中,我们创建了四个路由:
- /todos:将返回所有 Todo 存储在我们的数据库中。
- /todos(POST):将接受一个包含 Todo 标题的请求荷载,并将新 Todo 存储在我们的数据库中。
- /todos/{id}(PUT):将接受一个包含 Todo 标题和完成状态的请求荷载,并将更新给定 ID 的 Todo。
- /todos/{id}(DELETE):将删除给定 ID 的 Todo。
现在,我们已经准备好运行我们的应用程序。输入下列代码:
$ node server.js
打开浏览器,访问 http://localhost:3000/todos ,您将看到空数组。运行curl命令,可以在控制台看到详细信息:
curl --header "Content-Type: application/json" \ --request POST \ --data '{"title":"Toy model"}' \ http://localhost:3000/todos
重新访问 http://localhost:3000/todos 链接,您将看到 Toy model 项目已经被添加进入了列表中。
总结
在本教程中,我们介绍了如何使用 Hapi.js 与 PostgreSQL 集成。我们学习了如何使用 Sequelize 来定义数据模型,如何将其与 PostgreSQL 集成,以及如何在 Hapi.js 应用程序中使用它。
此外,我们还介绍了如何使用环境变量以安全的方式存储敏感信息,例如数据库密码。我们还讨论了测试数据库连接的方法。希望这篇文章对初学者有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c269ae83d39b488166aa04