使用 ServBay 设置 Hapi.js 开发环境
Hapi.js 是一个强大且灵活的 Node.js 框架,适用于构建应用程序和 API。ServBay 为 Node.js 开发者提供了一个便捷的本地开发环境,集成了 Node.js 运行时、多种数据库以及易于配置的 Web 服务器功能。本文将指导您如何在 ServBay 环境下创建、运行 Hapi.js 项目,并配置 ServBay 的网站功能进行访问,同时演示如何连接 ServBay 内置的数据库。
什么是 Hapi.js?
Hapi.js 是一个由 Walmart Labs 开发的、用于构建应用程序和服务的强大、灵活的 Node.js 框架。它以其强大的插件系统、配置驱动的方法和内置的安全特性而闻名,使得开发者可以更高效地构建高性能、可维护的 Web 应用和 API。
Hapi.js 的主要特性和优势
- 插件系统: Hapi.js 拥有强大且易于使用的插件系统,可以轻松地扩展框架功能或将应用逻辑组织成可复用的模块。
- 配置优先: Hapi.js 推崇配置驱动的开发方式,通过详细的配置选项来定义路由、验证、缓存等行为。
- 输入验证: 内置强大的 Joi 库,提供声明式的数据验证能力,确保数据的完整性和安全性。
- 丰富的生态系统: 拥有活跃的社区和丰富的官方及第三方插件,涵盖了认证、授权、缓存、日志等各种常见功能需求。
- 安全性: 框架内置了多种安全特性,帮助开发者防范常见的 Web 安全威胁,如输入验证、CORS 控制等。
- 日志和调试: 提供了详细的请求生命周期日志和调试工具。
使用 Hapi.js,开发者可以专注于业务逻辑的实现,而将底层复杂的 HTTP 处理、路由、验证和安全问题交给框架处理。
使用 ServBay 设置 Hapi.js 项目
本节将引导您使用 ServBay 提供的 Node.js 环境来创建并运行一个基本的 Hapi.js 项目,并通过 ServBay 的网站功能(反向代理)进行访问。
前提条件
在开始之前,请确保:
- 您已经在 macOS 上成功安装了 ServBay。
- 您已经在 ServBay 应用中启用了 Node.js 软件包。您可以通过 ServBay 控制面板的 "软件包" 标签页找到并启用 Node.js。
- 您熟悉基本的终端操作和 Node.js 的 npm 包管理器。
创建 Hapi.js 项目
初始化项目目录
打开终端,进入 ServBay 建议的网站根目录
/Applications/ServBay/www
。在此目录下创建一个新的项目文件夹(例如servbay-hapi-app
)并进入该目录:bashcd /Applications/ServBay/www mkdir servbay-hapi-app cd servbay-hapi-app
1
2
3初始化 Node.js 项目
在项目目录中,使用 npm 初始化一个新的 Node.js 项目:
bashnpm init -y
1这将在项目根目录创建一个
package.json
文件。安装 Hapi.js 依赖
使用 npm 安装 Hapi.js 核心库:
bashnpm install @hapi/hapi
1这将把
@hapi/hapi
添加到您的项目依赖中。创建应用入口文件
在项目根目录下创建一个名为
server.js
的文件,并添加以下代码来创建一个简单的 Hapi.js 服务器:javascript'use strict'; // 启用严格模式 const Hapi = require('@hapi/hapi'); const init = async () => { const server = Hapi.server({ port: process.env.PORT || 3000, // 默认监听 3000 端口,或由环境变量 PORT 指定 host: 'localhost' // 监听本地回环地址 }); // 定义一个简单的根路由 server.route({ method: 'GET', path: '/', handler: (request, h) => { return 'Hello from Hapi.js powered by ServBay!'; } }); // 启动服务器 await server.start(); console.log('Server running on %s', server.info.uri); }; // 处理未捕获的 Promise Rejection 错误 process.on('unhandledRejection', (err) => { console.error(err); process.exit(1); // 退出进程 }); // 调用 init 函数启动应用 init();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33这段代码创建了一个 Hapi 服务器,监听
localhost
的指定端口(默认为 3000),并为根路径/
定义了一个简单的 GET 请求处理器。
进入开发模式并配置 ServBay 网站
在开发过程中,您可以直接运行 Node.js 应用,并通过 ServBay 的反向代理功能将其映射到自定义域名,以便在浏览器中访问,并利用 ServBay 提供的 SSL 证书。
运行 Hapi.js 开发服务器
在终端中,确保您位于
servbay-hapi-app
项目目录下,然后使用node
命令运行server.js
文件。为了与 ServBay 的反向代理配合,我们可以指定一个特定的端口,例如8585
:bashPORT=8585 node server.js
1服务器将启动并显示监听的 URI,例如
Server running on http://localhost:8585
。请保持此终端窗口开启,服务器正在运行。在 ServBay 中配置网站 (反向代理)
打开 ServBay 应用。切换到 "网站" 标签页,点击左下角的 "+" 按钮添加一个新的网站。
- 名称 (Name):
ServBay Hapi Dev
(可以自定义,用于在 ServBay 列表中标识) - 域名 (Domain):
servbay-hapi-dev.servbay.demo
(建议使用.servbay.demo
后缀以避免与真实域名冲突,并利用 ServBay 的本地 CA 证书) - 网站类型 (Type): 选择
反向代理 (Reverse Proxy)
- 代理到 (Proxy to):
- 协议 (Protocol):
http
- IP 地址 (IP Address):
127.0.0.1
(因为 Node.js 服务器运行在本地回环地址) - 端口 (Port):
8585
(与您运行node server.js
时指定的 PORT 环境变量一致)
- 协议 (Protocol):
点击 "添加" 完成配置。ServBay 会自动为您配置 Web 服务器(如 Caddy 或 Nginx)以将
https://servbay-hapi-dev.servbay.demo
的请求反向代理到http://127.0.0.1:8585
。ServBay 还会自动为.servbay.demo
域名生成并信任 SSL 证书 (通过 ServBay User CA),使您可以在本地通过 HTTPS 安全访问。如果您需要更详细的 ServBay 网站配置步骤,请参考 ServBay 网站配置文档。
- 名称 (Name):
访问开发中的 Hapi.js 应用
打开您的 Web 浏览器,访问您配置的域名
https://servbay-hapi-dev.servbay.demo
。您应该会看到页面显示 "Hello from Hapi.js powered by ServBay!"。现在,您对
server.js
文件进行的任何修改(通常结合 nodemon 等工具实现热重载)都将通过 ServBay 的反向代理反映在浏览器中。
部署生产版本(示例)
对于生产环境,您可能需要更健壮的进程管理(如 PM2)和不同的配置。以下是一个简单的示例,展示如何运行在另一个端口并通过 ServBay 反向代理:
运行 Hapi.js 生产服务器
假设您使用不同的端口(例如
8586
)和生产环境配置来运行您的应用:bashPORT=8586 NODE_ENV=production node server.js
1(注意:在实际生产环境中,您会使用 PM2 或其他工具来管理 Node.js 进程,确保其稳定运行和自动重启。ServBay 也支持集成 PM2。)
在 ServBay 中配置生产网站 (反向代理)
在 ServBay 应用的 "网站" 标签页中,再次点击 "+" 添加新网站:
- 名称 (Name):
ServBay Hapi Prod
- 域名 (Domain):
servbay-hapi-prod.servbay.demo
- 网站类型 (Type):
反向代理 (Reverse Proxy)
- 代理到 (Proxy to):
- 协议 (Protocol):
http
- IP 地址 (IP Address):
127.0.0.1
- 端口 (Port):
8586
- 协议 (Protocol):
点击 "添加"。
- 名称 (Name):
访问生产版本的 Hapi.js 应用
打开浏览器,访问
https://servbay-hapi-prod.servbay.demo
。您将看到与开发模式相同的输出(除非您的代码根据NODE_ENV
有不同行为),但这是通过模拟生产环境的端口和配置运行的。
通过 ServBay 的网站功能,您可以轻松管理多个本地开发或模拟生产环境的域名,并将它们映射到在不同端口上运行的 Hapi.js (或其他 Node.js) 应用实例。
连接 ServBay 提供的数据库
ServBay 内置并支持多种数据库系统,包括 MySQL、MariaDB、PostgreSQL、MongoDB 和 Redis。本节演示如何在 Hapi.js 项目中连接这些数据库。
重要: 在尝试连接数据库之前,请确保您已经在 ServBay 应用的 "软件包" 标签页中启用了您需要的数据库软件包,并已启动相应的数据库服务。您可以在 ServBay 控制面板中查看数据库的运行状态。
ServBay 默认的数据库用户和密码如下:
- MySQL/MariaDB: 用户名
root
, 密码password
- PostgreSQL: 用户名
user
, 密码password
- MongoDB: 无需认证(默认)
- Redis: 无需认证(默认)
注意: 出于安全考虑,强烈建议您在 ServBay 中修改数据库的默认密码,尤其是在用于非本地环境时。您可以通过 ServBay 提供的功能轻松重置 MySQL、MariaDB、PostgreSQL 的 root 密码。请参考 重置数据库密码文档。
以下是连接各种数据库的示例代码片段。您需要先使用 npm 安装相应的数据库客户端库。
连接 MySQL
安装 MySQL 客户端库:
bashnpm install mysql2 # 或 mysql
1示例连接代码 (使用
mysql2
):javascriptconst mysql = require('mysql2'); const connection = mysql.createConnection({ host: 'localhost', user: 'root', // ServBay 默认用户名 password: 'password', // ServBay 默认密码 database: 'servbay_hapi_app' // 请替换为您的数据库名 }); connection.connect(err => { if (err) { console.error('Error connecting to MySQL: ' + err.stack); return; } console.log('Connected to MySQL as id ' + connection.threadId); }); // 在需要时关闭连接 // connection.end();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19连接 MariaDB
安装 MariaDB 客户端库:
bashnpm install mariadb
1示例连接代码:
javascriptconst mariadb = require('mariadb'); const pool = mariadb.createPool({ host: 'localhost', user: 'root', // ServBay 默认用户名 password: 'password', // ServBay 默认密码 database: 'servbay_hapi_app', // 请替换为您的数据库名 connectionLimit: 5 // 连接池大小 }); pool.getConnection() .then(conn => { console.log("Connected to MariaDB"); // conn.query(...) 执行查询 conn.release(); // 将连接返回连接池 }) .catch(err => { console.error("Not connected to MariaDB due to error: " + err); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18连接 PostgreSQL
安装 PostgreSQL 客户端库:
bashnpm install pg
1示例连接代码:
javascriptconst { Pool } = require('pg'); const pool = new Pool({ user: 'user', // ServBay 默认用户名 host: 'localhost', database: 'servbay_hapi_app', // 请替换为您的数据库名 password: 'password', // ServBay 默认密码 port: 5432, // PostgreSQL 默认端口 }); pool.connect((err, client, done) => { if (err) { console.error('Error connecting to PostgreSQL: ', err); return; } console.log('Connected to PostgreSQL'); client.query('SELECT NOW()', (err, res) => { done(); // 释放客户端连接 if (err) { console.error('Error executing query', err.stack); } else { console.log('PostgreSQL current time:', res.rows[0].now); } }); }); // 连接池会在应用退出时自动关闭 // pool.end();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27连接 MongoDB
安装 MongoDB 客户端库:
bashnpm install mongoose # 或 mongodb
1示例连接代码 (使用
mongoose
):javascriptconst mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/servbay-hapi-app', { useNewUrlParser: true, useUnifiedTopology: true, // ServBay 默认安装的 MongoDB 无需认证,如果配置了认证,请添加 authSource, user, pass 选项 // authSource: 'admin', // user: 'your_username', // pass: 'your_password', }) .then(() => console.log('MongoDB connected')) .catch(err => console.error('MongoDB connection error:', err)); // Mongoose 连接在整个应用生命周期内保持活跃 // 断开连接: mongoose.connection.close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15连接 Redis
安装 Redis 客户端库:
bashnpm install redis
1示例连接代码:
javascriptconst redis = require('redis'); // 使用默认连接参数: host: 'localhost', port: 6379 const client = redis.createClient(); client.on('error', function (err) { console.error('Redis Error: ' + err); }); client.on('connect', function () { console.log('Redis client connected'); }); // 连接到 Redis 服务器 client.connect(); // 对于 redis v4+ 需要调用 connect() // 示例:设置和获取键值 // async function exampleRedisUsage() { // await client.set('mykey', 'myvalue'); // const value = await client.get('mykey'); // console.log('Value from Redis:', value); // await client.del('mykey'); // } // exampleRedisUsage(); // 在应用退出时关闭连接 // client.quit();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
将这些连接代码集成到您的 Hapi.js 应用中,您就可以在本地开发环境中使用 ServBay 提供的各种数据库服务了。
总结
通过 ServBay,在 macOS 上搭建 Hapi.js 开发环境变得非常高效。ServBay 提供了一站式的解决方案,包括易于安装和管理的 Node.js 运行时、多种开箱即用的数据库,以及通过网站功能(反向代理和自动 SSL 配置)简化了本地访问设置。遵循本文的步骤,您可以快速启动您的 Hapi.js 项目,并利用 ServBay 的强大功能来加速您的开发流程。