Thiết lập môi trường phát triển Hapi.js với ServBay
Hapi.js là một framework Node.js mạnh mẽ và linh hoạt, lý tưởng để xây dựng các ứng dụng và API. ServBay mang đến cho các lập trình viên Node.js một môi trường phát triển tại chỗ hiện đại, tích hợp sẵn runtime Node.js, nhiều hệ cơ sở dữ liệu, cùng khả năng cấu hình máy chủ web dễ dàng. Bài viết này sẽ hướng dẫn bạn cách tạo và chạy dự án Hapi.js trong môi trường ServBay, cấu hình tính năng Website để truy cập dự án, đồng thời trình bày cách kết nối với các cơ sở dữ liệu có sẵn trong ServBay.
Hapi.js là gì?
Hapi.js được phát triển bởi Walmart Labs, là một framework Node.js mạnh mẽ, linh hoạt dùng để xây dựng các ứng dụng và dịch vụ. Hapi.js nổi bật với hệ thống plugin linh hoạt, cách tiếp cận dựa trên cấu hình và các tính năng bảo mật tích hợp sẵn, cho phép lập trình viên xây dựng nhanh chóng các ứng dụng web và API hiệu suất cao, dễ bảo trì.
Những tính năng và ưu điểm nổi bật của Hapi.js
- Hệ thống plugin: Hapi.js cung cấp hệ plugin mạnh mẽ, giúp mở rộng dễ dàng hoặc tổ chức logic ứng dụng thành các module tái sử dụng.
- Ưu tiên cấu hình: Hỗ trợ phát triển dựa trên cấu hình, giúp lập trình viên định nghĩa route, xác thực, cache và nhiều hành vi khác một cách chi tiết.
- Xác thực đầu vào: Tích hợp thư viện Joi mạnh mẽ, cho phép xác thực dữ liệu theo kiểu khai báo, đảm bảo tính toàn vẹn và bảo mật của dữ liệu.
- Hệ sinh thái phong phú: Sở hữu cộng đồng năng động cũng như nhiều plugin chính thức và bên thứ ba cho các nhu cầu phổ biến như xác thực, phân quyền, cache, logging, v.v.
- Bảo mật: Có nhiều cơ chế bảo mật mặc định giúp lập trình viên phòng chống các mối đe doạ phổ biến (xác thực dữ liệu đầu vào, điều khiển CORS...).
- Log và debug: Cung cấp log chi tiết cho vòng đời request và các công cụ debug tiện dụng.
Với Hapi.js, bạn có thể tập trung vào phát triển logic nghiệp vụ, trong khi những phần phức tạp của HTTP, routing, xác thực và bảo mật đều được framework xử lý tối ưu.
Thiết lập dự án Hapi.js với ServBay
Phần này sẽ hướng dẫn bạn sử dụng môi trường Node.js do ServBay cung cấp để tạo và chạy một dự án Hapi.js cơ bản, đồng thời truy cập thông qua tính năng Website (reverse proxy) của ServBay.
Điều kiện tiên quyết
Trước khi bắt đầu, hãy đảm bảo rằng:
- Bạn đã cài đặt thành công ServBay trên macOS.
- Node.js package đã được kích hoạt trong ứng dụng ServBay. Mở giao diện ServBay, vào tab "Package" để kiểm tra và bật Node.js.
- Bạn quen thuộc với các thao tác cơ bản trong Terminal và biết sử dụng npm - trình quản lý gói của Node.js.
Khởi tạo dự án Hapi.js
Tạo thư mục dự án
Mở Terminal, di chuyển đến thư mục gốc website khuyến nghị của ServBay:
/Applications/ServBay/www
. Trong thư mục này, hãy tạo một folder mới cho dự án (ví dụ:servbay-hapi-app
) và cd vào:bashcd /Applications/ServBay/www mkdir servbay-hapi-app cd servbay-hapi-app
1
2
3Khởi tạo dự án Node.js
Chạy lệnh npm để tạo dự án Node.js mới:
bashnpm init -y
1Lệnh này sẽ tạo file
package.json
ở thư mục gốc dự án.Cài đặt Hapi.js
Cài đặt thư viện Hapi.js bằng npm:
bashnpm install @hapi/hapi
1Gói
@hapi/hapi
sẽ được thêm vào danh sách phụ thuộc của dự án.Tạo file entry point cho ứng dụng
Tạo file
server.js
ở thư mục gốc dự án và thêm đoạn mã sau để khởi tạo một server Hapi.js đơn giản:javascript'use strict'; // Kích hoạt chế độ nghiêm ngặt const Hapi = require('@hapi/hapi'); const init = async () => { const server = Hapi.server({ port: process.env.PORT || 3000, // Lắng nghe cổng 3000 mặc định, hoặc cổng do biến môi trường PORT chỉ định host: 'localhost' // Lắng nghe trên địa chỉ localhost }); // Định nghĩa một route gốc đơn giản server.route({ method: 'GET', path: '/', handler: (request, h) => { return 'Hello from Hapi.js powered by ServBay!'; } }); // Khởi động server await server.start(); console.log('Server running on %s', server.info.uri); }; // Xử lý lỗi Promise Rejection chưa được bắt process.on('unhandledRejection', (err) => { console.error(err); process.exit(1); // Thoát tiến trình }); // Gọi hàm init để khởi động ứng dụng 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Đoạn code trên khởi tạo một server Hapi, lắng nghe trên cổng được chỉ định (
localhost:3000
theo mặc định), đồng thời định nghĩa route GET/
trả về một chuỗi đơn giản.
Chạy chế độ phát triển & cấu hình Website với ServBay
Trong quá trình phát triển, bạn có thể chạy ứng dụng Node.js rồi dùng chức năng reverse proxy của ServBay để trỏ nó tới domain tuỳ chọn — dễ dàng truy cập qua trình duyệt và tận dụng SSL miễn phí do ServBay cấp phát.
Chạy server phát triển Hapi.js
Đảm bảo bạn đang ở thư mục
servbay-hapi-app
, sau đó dùng lệnhnode
để chạy fileserver.js
. Để thuận tiện reverse proxy với ServBay, bạn nên chỉ định cổng riêng, ví dụ8585
:bashPORT=8585 node server.js
1Server sẽ khởi động và hiển thị URI lắng nghe, ví dụ:
Server running on http://localhost:8585
. Giữ nguyên cửa sổ Terminal để server tiếp tục chạy.Cấu hình website (reverse proxy) trong ServBay
Mở ứng dụng ServBay, chuyển sang tab "Website", nhấn nút "+" ở góc trái dưới để thêm website mới.
- Tên (Name):
ServBay Hapi Dev
(tuỳ ý, để nhận diện) - Tên miền (Domain):
servbay-hapi-dev.servbay.demo
(nên dùng hậu tố.servbay.demo
để tránh đụng với domain thật và dùng được SSL tự động của ServBay) - Loại website (Type): chọn
Reverse Proxy (Phản hồi ngược)
- Proxy tới (Proxy to):
- Giao thức (Protocol):
http
- Địa chỉ IP (IP Address):
127.0.0.1
(do server Node.js chạy tại localhost) - Cổng (Port):
8585
(giống PORT dùng khi chạy server.js)
- Giao thức (Protocol):
Nhấn "Thêm" để hoàn tất. ServBay sẽ tự động cấu hình web server (Caddy hoặc Nginx...) để reverse proxy traffic từ
https://servbay-hapi-dev.servbay.demo
đếnhttp://127.0.0.1:8585
. Ngoài ra, ServBay cũng tự sinh và tin cậy SSL certificate cho domain.servbay.demo
(qua ServBay User CA) — bạn có thể truy cập website local qua HTTPS an toàn.Xem tài liệu cấu hình website ServBay nếu cần hướng dẫn chi tiết hơn.
- Tên (Name):
Truy cập ứng dụng Hapi.js trong quá trình phát triển
Mở trình duyệt và truy cập domain vừa cấu hình, ví dụ:
https://servbay-hapi-dev.servbay.demo
. Bạn sẽ nhìn thấy dòng "Hello from Hapi.js powered by ServBay!".Mỗi khi bạn sửa đổi file
server.js
(tốt nhất kết hợp với nodemon để tự reload server), thay đổi sẽ được cập nhật qua reverse proxy của ServBay trên trình duyệt.
Triển khai phiên bản Production (Ví dụ)
Khi chuyển sang môi trường production, bạn có thể cần dùng process manager như PM2 cùng các cấu hình khác. Dưới đây là ví dụ đơn giản minh hoạ quá trình vận hành trên cổng khác và reverse proxy qua ServBay:
Chạy server Hapi.js ở chế độ production
Ví dụ dùng cổng khác (8586) và chế độ production để chạy ứng dụng:
bashPORT=8586 NODE_ENV=production node server.js
1(Lưu ý: Thực tế production nên dùng PM2 hoặc các tool chuyên dụng để quản lý tiến trình Node.js, đảm bảo tự động hồi phục khi server bị lỗi. ServBay cũng hỗ trợ tích hợp PM2.)
Cấu hình website production (reverse proxy) trên ServBay
Trong tab "Website" của ServBay, nhấn "+" để thêm website mới:
- Tên (Name):
ServBay Hapi Prod
- Tên miền (Domain):
servbay-hapi-prod.servbay.demo
- Loại website (Type):
Reverse Proxy (Phản hồi ngược)
- Proxy tới (Proxy to):
- Giao thức (Protocol):
http
- Địa chỉ IP (IP Address):
127.0.0.1
- Cổng (Port):
8586
- Giao thức (Protocol):
Nhấn "Thêm" để hoàn tất.
- Tên (Name):
Truy cập ứng dụng Production
Mở trình duyệt và vào
https://servbay-hapi-prod.servbay.demo
. Bạn sẽ thấy kết quả giống môi trường dev (trừ khi code có hành vi khác biệt theo biếnNODE_ENV
), nhưng server đang hoạt động với cổng và cấu hình mô phỏng environment production.
Với tính năng Website của ServBay, bạn có thể dễ dàng quản lý nhiều domain local cho môi trường dev hoặc simulate production, linh hoạt ánh xạ tới các instance Hapi.js (hoặc Node.js khác) chạy trên những cổng khác nhau.
Kết nối tới cơ sở dữ liệu do ServBay cung cấp
ServBay hỗ trợ và tích hợp sẵn nhiều hệ cơ sở dữ liệu lớn như MySQL, MariaDB, PostgreSQL, MongoDB, Redis. Phần này minh hoạ cách kết nối các database này từ dự án Hapi.js.
Quan trọng: Đảm bảo bạn đã bật (Enable) các package database cần thiết và đã khởi động dịch vụ tương ứng ở tab "Package" của ServBay. Hãy kiểm tra trạng thái database trong bảng điều khiển ServBay trước khi kết nối.
Thông tin đăng nhập database mặc định của ServBay:
- MySQL/MariaDB: Username
root
, passwordpassword
- PostgreSQL: Username
user
, passwordpassword
- MongoDB: Không yêu cầu xác thực (mặc định)
- Redis: Không yêu cầu xác thực (mặc định)
Lưu ý: Vì lý do bảo mật, hãy thay đổi mật khẩu database mặc định trên ServBay nếu sử dụng ngoài môi trường local. Có thể thực hiện nhanh qua tính năng Reset password trong ServBay cho MySQL, MariaDB, PostgreSQL — Xem hướng dẫn reset mật khẩu database.
Dưới đây là các đoạn mã mẫu kết nối đến từng loại database. Bạn cần cài đúng client bằng npm trước khi kết nối.
Kết nối MySQL
Cài đặt thư viện MySQL client:
bashnpm install mysql2 # hoặc mysql
1Ví dụ kết nối (dùng
mysql2
):javascriptconst mysql = require('mysql2'); const connection = mysql.createConnection({ host: 'localhost', user: 'root', // Username mặc định của ServBay password: 'password', // Password mặc định của ServBay database: 'servbay_hapi_app' // Đổi thành tên database của bạn }); connection.connect(err => { if (err) { console.error('Error connecting to MySQL: ' + err.stack); return; } console.log('Connected to MySQL as id ' + connection.threadId); }); // Đóng kết nối khi cần // connection.end();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19Kết nối MariaDB
Cài đặt MariaDB client:
bashnpm install mariadb
1Ví dụ kết nối:
javascriptconst mariadb = require('mariadb'); const pool = mariadb.createPool({ host: 'localhost', user: 'root', // Username mặc định của ServBay password: 'password', // Password mặc định của ServBay database: 'servbay_hapi_app', // Đổi thành tên database của bạn connectionLimit: 5 // Số lượng kết nối tối đa trong pool }); pool.getConnection() .then(conn => { console.log("Connected to MariaDB"); // conn.query(...) để thực hiện truy vấn conn.release(); // Trả kết nối về pool }) .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
18Kết nối PostgreSQL
Cài đặt PostgreSQL client:
bashnpm install pg
1Ví dụ kết nối:
javascriptconst { Pool } = require('pg'); const pool = new Pool({ user: 'user', // Username mặc định của ServBay host: 'localhost', database: 'servbay_hapi_app', // Đổi thành tên database của bạn password: 'password', // Password mặc định của ServBay port: 5432, // Cổng mặc định của 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(); // Giải phóng client về pool if (err) { console.error('Error executing query', err.stack); } else { console.log('PostgreSQL current time:', res.rows[0].now); } }); }); // Pool sẽ tự đóng khi app kết thúc // 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
27Kết nối MongoDB
Cài đặt MongoDB client:
bashnpm install mongoose # hoặc mongodb
1Ví dụ kết nối (dùng mongoose):
javascriptconst mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/servbay-hapi-app', { useNewUrlParser: true, useUnifiedTopology: true, // Với MongoDB mặc định trên ServBay không cần xác thực, nếu cấu hình có auth thì thêm authSource, user, pass // authSource: 'admin', // user: 'your_username', // pass: 'your_password', }) .then(() => console.log('MongoDB connected')) .catch(err => console.error('MongoDB connection error:', err)); // Kết nối mongoose giữ xuyên suốt vòng đời app // Ngắt kết nối: mongoose.connection.close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Kết nối Redis
Cài đặt Redis client:
bashnpm install redis
1Ví dụ kết nối:
javascriptconst redis = require('redis'); // Mặc định dùng 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'); }); // Kết nối tới server Redis client.connect(); // Với redis v4+ phải gọi connect() // Ví dụ: set & get value // 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(); // Đóng kết nối khi ứng dụng kết thúc // 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
Tích hợp các đoạn connect DB này vào ứng dụng Hapi.js của bạn, môi trường phát triển local với database do ServBay cung cấp đã sẵn sàng phục vụ dự án.
Tổng kết
Nhờ ServBay, bạn có thể thiết lập môi trường phát triển Hapi.js trên macOS một cách cực kỳ nhanh chóng và hiệu quả. ServBay mang tới giải pháp trọn gói từ runtime Node.js dễ cài đặt, nhiều hệ quản trị cơ sở dữ liệu tích hợp sẵn, tới tính năng Website (reverse proxy & tự động cấp SSL), giúp đơn giản hoá cấu hình truy cập website local. Hãy thực hiện theo các bước trong bài viết để khởi động ngay dự án Hapi.js của bạn và tận dụng tối đa sức mạnh từ ServBay, tăng tốc quá trình phát triển phần mềm của bản thân.