ServBayでHapi.js開発環境を構築する
Hapi.jsは、アプリケーションやAPIの構築に適した強力で柔軟なNode.jsフレームワークです。ServBayはNode.js開発者向けに、Node.jsランタイムや各種データベース、簡単に設定できるWebサーバー機能を統合した便利なローカル開発環境を提供しています。本記事では、ServBay環境下でのHapi.jsプロジェクトの作成・実行方法、ServBayのサイト機能を利用したアクセス設定、および内蔵データベースへの接続方法を解説します。
Hapi.jsとは?
Hapi.jsはWalmart Labsによって開発された、アプリケーションとサービス構築のためのパワフルで柔軟なNode.jsフレームワークです。拡張性の高いプラグイン機構や設定指向の手法、組み込みのセキュリティ機能で知られ、高性能かつメンテナンス性の高いWebアプリやAPIの開発を効率化します。
Hapi.jsの主な特徴とメリット
- プラグインシステム: Hapi.jsは扱いやすいプラグイン機構を持ち、機能拡張やアプリのロジックを再利用可能なモジュールとして分離できます。
- 設定重視: 詳細な設定でルーティングやバリデーション、キャッシュなどの挙動を制御でき、設定指向の開発が可能です。
- 入力バリデーション: 強力なJoiライブラリを標準搭載し、宣言的なデータバリデーションでデータの完全性とセキュリティを確保します。
- 豊富なエコシステム: コミュニティが活発で、公式・サードパーティ製プラグインが充実。認証、認可、キャッシュ、ログ記録など多様なニーズをカバーしています。
- セキュリティ: 入力検証やCORS対策など、各種セキュリティ対策が標準実装されています。
- ログ・デバッグ: 詳細なリクエストライフサイクルのログやデバッグツールを利用できます。
Hapi.jsを使えば、開発者はビジネスロジックの実装に集中でき、HTTP処理やルーティング、バリデーション、セキュリティといった複雑な基盤部分をフレームワークに任せられます。
ServBayでHapi.jsプロジェクトをセットアップする
このセクションでは、ServBayが提供するNode.js環境で基本的なHapi.jsプロジェクトを作成・実行し、サイト機能(リバースプロキシ)を用いてブラウザからアクセスするまでの流れを説明します。
前提条件
始める前に、以下を確認してください。
- ServBayがmacOS上にインストール済みであること。
- ServBayアプリ内でNode.jsのパッケージが有効化されていること。ServBayコントロールパネルの「パッケージ」タブでNode.jsを有効にできます。
- 基本的なターミナル操作及びnpmパッケージマネージャーの利用に慣れていること。
Hapi.jsプロジェクトの作成
プロジェクトディレクトリの初期化
ターミナルを開き、ServBay推奨のWebルートディレクトリ
/Applications/ServBay/www
に移動します。このディレクトリ下に新しいプロジェクトフォルダ(例:servbay-hapi-app
)を作成し、その中に移動しましょう。bashcd /Applications/ServBay/www mkdir servbay-hapi-app cd servbay-hapi-app
1
2
3Node.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'; // 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例外をハンドル 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のリバースプロキシ機能で独自ドメインにマッピングすることで、SSL認証つきでブラウザからアクセスできるようになります。
Hapi.js開発サーバーを起動
ターミナルで
servbay-hapi-app
ディレクトリにいることを確認し、node
コマンドでserver.js
を実行します。ServBayのリバースプロキシと連携するため、たとえば8585
のような特定ポートを指定しましょう。bashPORT=8585 node server.js
1サーバー起動後、「Server running on
http://localhost:8585
」などのメッセージが表示されます。このターミナルはサーバー実行中なので開いたままに。ServBayにてサイト(リバースプロキシ)を設定
ServBayアプリを開き、「サイト」タブへ移動、左下の「+」ボタンで新規サイトを追加。
- 名称 (Name):
ServBay Hapi Dev
(識別しやすい名称なら任意でOK) - ドメイン (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はCaddyやNginxなどのWebサーバーに設定を自動反映し、
https://servbay-hapi-dev.servbay.demo
へのリクエストをhttp://127.0.0.1:8585
へリバースプロキシします。また.servbay.demo
ドメイン用SSL証明書(ServBay User CAによる)も自動生成・信頼済みで、ローカルでもHTTPS安全アクセスが可能です。サイト設定の詳細は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
と、本番用NODE_ENVでアプリを実行します。bashPORT=8586 NODE_ENV=production node server.js
1(注意:本番運用時にはPM2等でのプロセス管理・自動再起動を強く推奨します。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コントロールパネルから稼働状況が確認できます。
デフォルトのデータベースユーザーとパスワード:
- 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' // ご自分のDB名を指定 }); 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
19MariaDBへの接続
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', // ご自分のDB名を指定 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
18PostgreSQLへの接続
PostgreSQLクライアントをインストール:
bashnpm install pg
1接続例:
javascriptconst { Pool } = require('pg'); const pool = new Pool({ user: 'user', // ServBay標準ユーザー名 host: 'localhost', database: 'servbay_hapi_app', // ご自分のDB名を指定 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
27MongoDBへの接続
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
15Redisへの接続
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開発環境の構築は非常に効率的・快適になります。Node.jsランタイムや複数のデータベースがワンストップで利用でき、サイト機能によるリバースプロキシ&自動SSL設定によってローカルアクセス設定も簡素化。この記事の手順に沿えば、Hapi.jsプロジェクトを迅速に立ち上げ、ServBayの強力な機能を最大限活かしてスムーズな開発フローを実現できます。