使用 ServBay 建立 Hapi.js 開發環境
Hapi.js 是一套強大且彈性的 Node.js 框架,非常適合用來構建應用與 API。ServBay 為 Node.js 開發者提供便利的本機開發環境,整合了 Node.js 執行時、多種資料庫,以及易於設定的網頁伺服器功能。本文將引導你如何在 ServBay 下建立、執行 Hapi.js 專案,並設定 ServBay 網站功能進行存取,同時示範如何連接 ServBay 內建的各種資料庫服務。
什麼是 Hapi.js?
Hapi.js 由 Walmart Labs 所開發,是一款專注於構建應用程式及服務的強大且具彈性的 Node.js 框架。它以強大的外掛插件系統、設定導向的方法以及內建的安全特性聞名,讓開發者能更高效建構高效能、易於維護的 Web 應用與 API。
Hapi.js 的主要特性與優勢
- **插件系統:**Hapi.js 擁有易於擴充且先進的插件系統,能方便地延展框架功能或者將應用邏輯組織為可重用模組。
- **設定為先:**Hapi.js 推崇以設定驅動開發,透過詳細的組態選項定義路由、驗證、快取等行為。
- **資料驗證:**內建強大的 Joi 庫,提供宣告式資料驗證功能,確保資料的正確性與安全性。
- **豐富生態系:**活躍社群與大量官方/第三方插件,涵蓋認證、授權、快取、日誌等常見需求。
- **安全性:**框架設計時便內建多種安全功能,如資料驗證、CORS 控管,協助防範常見 Web 安全威脅。
- **日誌與除錯:**提供完整請求生命周期日誌與除錯工具。
有了 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
,同時指定一組埠號(比如8585
)以便與 ServBay 反向代理搭配:bashPORT=8585 node server.js
1伺服器會啟動並顯示監聽的連結,例如
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.demo
網域會自動配置並信任 SSL 憑證(ServBay 使用者 CA),讓你能於本機安全連線(HTTPS)。若需更詳盡之 ServBay 網站設定,請參考 ServBay 網站配置說明。
- 名稱(Name):
存取開發中的 Hapi.js 應用
開啟網頁瀏覽器,造訪設定好的網址
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 提供簡易介面讓你重設 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 強大功能來加速開發流程。