การตั้งค่าสภาพแวดล้อม Hapi.js สำหรับการพัฒนาด้วย ServBay
Hapi.js คือเฟรมเวิร์ก Node.js ที่ทรงพลังและยืดหยุ่น เหมาะสำหรับสร้างแอปพลิเคชันและ API โดย ServBay มอบสภาพแวดล้อมพัฒนา Node.js ที่สะดวก ใช้งานง่าย พร้อมความสามารถในการรันหลายฐานข้อมูลและเว็บเซิร์ฟเวอร์ที่ปรับแต่งได้ ในบทความนี้ คุณจะได้เรียนรู้วิธีสร้างและรันโปรเจกต์ Hapi.js ภายใต้ ServBay วิธีปรับแต่งฟีเจอร์ เว็บไซต์ ของ ServBay เพื่อการเข้าถึง และการเชื่อมต่อกับฐานข้อมูลต่างๆ ที่ติดตั้งมาให้พร้อมใช้งาน
Hapi.js คืออะไร?
Hapi.js ถูกพัฒนาโดย Walmart Labs เป็นเฟรมเวิร์ก Node.js สำหรับการสร้างแอปพลิเคชันและบริการที่มีความยืดหยุ่นและเปี่ยมไปด้วยฟีเจอร์ โดดเด่นด้วยระบบปลั๊กอินที่แข็งแกร่ง การตั้งค่าแบบ configuration-driven และฟีเจอร์ด้านความปลอดภัยในตัว ช่วยให้ผู้พัฒนาสร้างเว็บแอปหรือ API ที่มีประสิทธิภาพ ดูแลรักษาง่ายได้อย่างรวดเร็ว
คุณสมบัติสำคัญและจุดเด่นของ Hapi.js
- ระบบปลั๊กอิน: Hapi.js มีระบบปลั๊กอินที่แข็งแกร่งและใช้งานง่าย สามารถขยายขีดความสามารถของเฟรมเวิร์กหรือจัดระเบียบโค้ดแอปให้เป็นโมดูลนำกลับมาใช้ซ้ำได้
- เน้นที่การตั้งค่า: Hapi.js เน้นการกำหนดค่าผ่านไฟล์คอนฟิก เช่น routes, validation, cache ทำให้ควบคุมพฤติกรรมของระบบต่างๆ ได้อย่างยืดหยุ่น
- การตรวจสอบข้อมูลเข้า: มาพร้อมกับไลบรารี Joi สำหรับตรวจสอบข้อมูลแบบ declarative เพื่อความถูกต้องและปลอดภัยของข้อมูล
- อีโคซิสเต็มที่ครบครัน: มีคอมมิวนิตี้ที่แข็งแกร่ง พร้อมปลั๊กอินเสริมทั้งทางการและของบุคคลที่สาม เช่น authentication, authorization, caching, logging
- ความปลอดภัยสูง: มาพร้อมความสามารถด้านความปลอดภัย เช่น input validation, CORS control และอื่นๆ
- ระบบ log และ debug: ให้เครื่องมือสำหรับดู log และดีบัก lifecycle ของ request อย่างละเอียด
ด้วย Hapi.js ผู้พัฒนาจะโฟกัสไปที่ business logic โดยปล่อยให้เฟรมเวิร์กจัดการกับงานพื้นฐานของ HTTP, routing, validation และเรื่องความปลอดภัย
การสร้างโปรเจกต์ Hapi.js ด้วย ServBay
หัวข้อนี้จะพาคุณสร้างและรันโปรเจกต์ Hapi.js บนสภาพแวดล้อม Node.js ที่ ServBay เตรียมไว้ และตั้งค่า เว็บไซต์ (reverse proxy) เพื่อการเข้าถึงจากเบราว์เซอร์
สิ่งที่ต้องเตรียม
ก่อนเริ่มต้น โปรดตรวจสอบว่า:
- คุณได้ติดตั้ง ServBay ลงบน macOS เรียบร้อย
- เปิดใช้งาน แพ็คเกจ Node.js ในแอป ServBay แล้ว สามารถเปิดที่แท็บ "แพ็คเกจ" บนแดชบอร์ด ServBay
- คุณมีพื้นฐานการใช้ command line และ npm ของ Node.js
สร้างโปรเจกต์ Hapi.js
สร้างโฟลเดอร์โปรเจกต์
เปิด Terminal ไปที่โฟลเดอร์รากของเว็บไซต์ใน 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 เพื่อสร้างไฟล์โปรเจกต์:
bashnpm init -y
1จะมีไฟล์
package.json
สร้างขึ้นในรากโปรเจกต์ติดตั้ง Hapi.js
ติดตั้งไลบรารีหลักของ Hapi.js ด้วย npm:
bashnpm install @hapi/hapi
1คำสั่งนี้จะเพิ่ม
@hapi/hapi
เป็น dependencies ให้โปรเจกต์ของคุณสร้างไฟล์เริ่มต้นของแอป
สร้างไฟล์
server.js
ที่รูทของโปรเจกต์ และเพิ่มโค้ดดังนี้เพื่อรัน Hapi.js เซิร์ฟเวอร์แบบง่ายๆ:javascript'use strict'; // เปิดใช้ strict mode const Hapi = require('@hapi/hapi'); const init = async () => { const server = Hapi.server({ port: process.env.PORT || 3000, // ใช้พอร์ต 3000 ถ้าไม่ระบุ PORT ใน env host: 'localhost' // ใช้งานบน localhost }); // สร้าง root route เรียบง่าย server.route({ method: 'GET', path: '/', handler: (request, h) => { return 'Hello from Hapi.js powered by ServBay!'; } }); // เริ่มต้น server await server.start(); console.log('Server running on %s', server.info.uri); }; // จัดการ error จาก Promise ที่ไม่ได้ catch 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
ที่พอร์ตที่กำหนด (default 3000) พร้อม route GET/
ที่ตอบกลับข้อความตัวอย่าง
การเข้าสู่โหมดพัฒนาและตั้งค่าเว็บไซต์บน ServBay
ในขั้นตอนพัฒนา คุณสามารถรันแอป Node.js แล้วใช้ reverse proxy ของ ServBay เพื่อ map โดเมนที่คุณกำหนดให้เข้าถึงผ่านเบราว์เซอร์ พร้อมรองรับ SSL
รัน Hapi.js Development Server
ที่ terminal ให้แน่ใจว่าอยู่ในโฟลเดอร์โปรเจกต์
servbay-hapi-app
แล้วรัน server ด้วย node คุณสามารถระบุพอร์ตพิเศษ เช่น8585
เพื่อใช้งานร่วมกับ reverse proxy ของ ServBay:bashPORT=8585 node server.js
1เซิร์ฟเวอร์จะเริ่มต้นและแสดง URI เช่น
Server running on http://localhost:8585
โปรดเปิดหน้าต่าง terminal นี้ไว้ระหว่างใช้งานตั้งค่าเว็บไซต์ (reverse proxy) ใน ServBay
เปิดแอป ServBay ไปที่แท็บ "เว็บไซต์" แล้วคลิกปุ่ม "+" ซ้ายล่างเพิ่มเว็บไซต์ใหม่
- ชื่อ (Name):
ServBay Hapi Dev
(หรือชื่ออื่นที่ช่วยจดจำ) - โดเมน (Domain):
servbay-hapi-dev.servbay.demo
(แนะนำใช้.servbay.demo
เพื่อเลี่ยงชนกับโดเมนจริงและใช้ประโยชน์จาก CA Certificate ที่ ServBay จัดการให้) - ประเภทเว็บไซต์ (Type): เลือก
Reverse Proxy (ย้อนกลับพร็อกซี)
- Proxy ถึง (Proxy to):
- Protocol:
http
- IP Address:
127.0.0.1
(โปรแกรม Node.js ทำงานบน localhost) - Port:
8585
(ให้ตรงกับค่า PORT ที่รันโปรเจกต์)
- Protocol:
คลิก "เพิ่ม" เพื่อบันทึก ServBay จะตั้งค่าเว็บเซิร์ฟเวอร์ (Caddy หรือ Nginx) ให้ reverse proxy จาก
https://servbay-hapi-dev.servbay.demo
ไปที่http://127.0.0.1:8585
ให้อัตโนมัติ และตั้งค่า SSL certificate พร้อมสำหรับ.servbay.demo
ผ่าน CA ของ ServBay ให้คุณสามารถทดสอบ HTTPS ได้สมจริงบนเครื่อง localหากต้องการรายละเอียดการตั้งค่าเว็บไซต์ อ่านเอกสาร การตั้งค่าเว็บไซต์บน ServBay
- ชื่อ (Name):
เข้าถึงแอป Hapi.js
เปิดเบราว์เซอร์ แล้วเข้าชม
https://servbay-hapi-dev.servbay.demo
คุณจะเห็นข้อความ "Hello from Hapi.js powered by ServBay!"ทุกการแก้ไขไฟล์
server.js
(หรือในกรณีใช้ nodemon ระบบจะ reload อัตโนมัติ) จะสะท้อนในเบราว์เซอร์ผ่าน reverse proxy ของ ServBay
ตัวอย่างการ Deploy เวอร์ชันโปรดักชัน
สำหรับงานโปรดักชัน ควรมีการจัดการ process ที่ทนทานขึ้น (เช่น PM2) และแยก config ออกจาก dev ตัวอย่างนี้เป็นวิธีรันบนพอร์ตอื่นพร้อม reverse proxy สำหรับโปรดักชัน
รัน Hapi.js Production Server
สมมติรันด้วยพอร์ต (เช่น
8586
) และ config production:bashPORT=8586 NODE_ENV=production node server.js
1(ใน production จริงแนะนำให้ใช้ PM2 หรือเครื่องมือจัดการ process อื่นๆ ServBay รองรับ PM2 ด้วย)
ตั้งค่าเว็บไซต์โปรดักชันใน ServBay
ที่แท็บ "เว็บไซต์" คลิก "+" เพื่อสร้างเว็บไซต์ใหม่
- ชื่อ (Name):
ServBay Hapi Prod
- โดเมน (Domain):
servbay-hapi-prod.servbay.demo
- ประเภท (Type):
Reverse Proxy
- Proxy to:
- Protocol:
http
- IP Address:
127.0.0.1
- Port:
8586
- Protocol:
แล้วคลิก "เพิ่ม"
- ชื่อ (Name):
เข้าชมแอป Hapi.js Production
เข้าเบราว์เซอร์ที่
https://servbay-hapi-prod.servbay.demo
คุณจะเห็นผลลัพธ์เหมือนกับโหมดพัฒนา (ยกเว้นหากโค้ดของคุณเปลี่ยนแปลงที่NODE_ENV
) แต่การทำงานนี้จำลองสภาพแวดล้อมโปรดักชันแบบ local
ฟีเจอร์ เว็บไซต์ ของ ServBay ช่วยให้คุณจัดการโดเมนสำหรับ local development หรือ production simulation หลายตัวได้อย่างง่ายดาย แยกแอปที่รันต่างพอร์ตตามแต่ละสิ่งแวดล้อม
การเชื่อมต่อฐานข้อมูลที่มีใน ServBay
ServBay มีฐานข้อมูลยอดนิยมติดตั้งมาให้อย่าง MySQL, MariaDB, PostgreSQL, MongoDB และ Redis ตัวอย่างต่อไปนี้แสดงวิธีเชื่อมต่อฐานข้อมูลเหล่านี้จาก Hapi.js
สำคัญ: โปรดเปิดใช้งาน แพ็คเกจ ฐานข้อมูลในแท็บ "แพ็คเกจ" และตรวจสอบว่า service ทำงานแล้วในแผงควบคุม ServBay
ค่าผู้ใช้และรหัสเริ่มต้นของฐานข้อมูล ServBay:
- MySQL/MariaDB: ผู้ใช้
root
, รหัสpassword
- PostgreSQL: ผู้ใช้
user
, รหัสpassword
- MongoDB: ไม่ต้องใช้ username/password (default)
- Redis: ไม่ต้องใช้รหัสผ่าน (default)
หมายเหตุ: เพื่อความปลอดภัย ควรเปลี่ยนรหัสเริ่มต้นของฐานข้อมูลใน ServBay สำหรับกรณีใช้งานนอกเครื่อง local สามารถรีเซ็ตรหัสได้ง่ายผ่านฟีเจอร์ใน ServBay ศึกษาได้ที่ รีเซ็ตรหัสฐานข้อมูล
ตัวอย่างการเชื่อมต่อฐานข้อมูลต่างๆ (โปรดติดตั้งไลบรารี client ที่จำเป็นผ่าน npm ก่อน):
เชื่อมต่อ MySQL
ติดตั้งไลบรารีสำหรับ MySQL:
bashnpm install mysql2 # หรือ mysql
1ตัวอย่างโค้ด:
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 }); pool.getConnection() .then(conn => { console.log("Connected to MariaDB"); // conn.query(...) ดำเนินการสอบถาม conn.release(); // คืนการเชื่อมต่อสู่ 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
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(); // คืน client กลับ pool if (err) { console.error('Error executing query', err.stack); } else { console.log('PostgreSQL current time:', res.rows[0].now); } }); }); // pool จะปิดอัตโนมัติเมื่อโปรแกรมจบการทำงาน // 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, // ติดตั้ง MongoDB ของ ServBay ไม่ต้องใช้รหัส ถ้ามี authentication ให้เพิ่ม 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'); // ใช้ config ค่าเริ่มต้น: 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 server client.connect(); // redis v4+ ต้องเรียก connect() // ตัวอย่าง: ใส่ค่าและอ่านค่า key // 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 ติดตั้งมาให้ ทดสอบแบบ local ได้ทันที
สรุป
การตั้งค่าสภาพแวดล้อม Hapi.js บน macOS ด้วย ServBay ง่ายและรวดเร็วมาก ServBay มอบโซลูชันแบบ One-Stop ที่ครบถ้วน ทั้ง Node.js runtime ที่ติดตั้ง/อัปเดตง่าย หลายฐานข้อมูลพร้อมใช้งาน และฟีเจอร์ เว็บไซต์ สำหรับ reverse proxy และ SSL อัตโนมัติ ช่วยให้การ setup และพัฒนาบนเครื่อง local ราบรื่น ทำตามขั้นตอนข้างต้น คุณจะเริ่มโปรเจกต์ Hapi.js ได้เพียงไม่กี่นาที และใช้ความสามารถหลากหลายของ ServBay เร่งงานพัฒนาคุณให้เร็วขึ้น