5 วัน กับ NodeJS Hapi

KwangTung Taesuji
PranWorks
Published in
6 min readMay 9, 2019

เกริ่นก่อนเลยว่าผู้เขียนเดิมนั้นอยู่ในโลกแห่ง Azure พัฒนา Web Application และ Restful API ด้วย .Net Framework มาตลอด แต่ก็มีบางสิ่งบางอย่างที่ทำให้ได้ก้าวข้ามและได้มารู้จักกับโลกอีกใบที่ชื่อว่า NodeJs

บทความนี้จะเป็นการสรุปเรื่องราว 5 วันที่ได้สัมผัสเจ้า NodeJs ในมุมมองของ .Net Developer

เรามาตั้งโจทย์กันก่อน ก็คือ เราจะทำ Restful API ด้วย NodeJs ได้อย่างไร???

NodeJs คือ Opensource, ใช้ภาษา JavaScript ทำเป็น Client Side และServer Side อาจจะประยุกต์ให้อยู่ในรูปแบบ TypeScript หรืออื่น ๆ ก็ได้

เตรียมเครื่องมือให้พร้อม!!!

  • Install Visual Studio Code: เอาไว้เป็น Editor สำหรับการเขียนโค้ด
  • Postman: ใช้ยิงทดสอบ API
  • Browser: ใช้ทดสอบหน้า Web

วันที่ 1: Install NodeJs และทำความเข้าใจ NPM

เริ่ม Install Node กันก่อนเลยย

  1. กดไปที่ Node.Js เลือกว่าจะโหลด Windows หรือ Mac OS

2. เมื่อดาวน์โหลดแล้ว ก็กด Install และ Next ต่อไปเรื่อยจนกว่าจะ Finished

3. เปิด cmd ขึ้นมา และพิมพ์ node -v จะเห็นเลข Version ของ NodeJS ในที่นี้ คือ V 12.1.0 เป็นอันว่าเราได้ติดตั้ง NodeJs สมบูรณ์แล้วนั่นเอง

node -v

4. เปิด Visual Studio Code ขึ้นมา สร้าง NodeApi Project จากนั้น สร้างไฟล์ App.js แล้วลอง Hello World ไปด้วยกัน

5. เปิด Terminal แล้วลองรันดูผ่านคำสั่ง node ตามด้วยชื่อไฟล์ ในที่นี้คือ node app.js

node app.js

6. Run เลยยยย จะได้ผลลัพธ์ Hello World ดังนี้

7. ลองใช้ NPM (Node Package Manager)

NPM (Node Package Manager) คือ Module ที่มาในรูปแบบ Package สำหรับการพัฒนา NodeJs ว่าง่าย ๆ คือ จุดศูนย์กลางที่รวมส่วนเสริม หรือ ฟังก์ชั่นสำเร็จรูปที่พร้อมให้เราเรียกใช้งาน อีกทั้งยังเป็นตัวจัดการเพื่อ sharing module ที่เราพัฒนาขึ้นมาได้ด้วย

ลอง Install NPM กันเลย!!!

NPM สำหรับ NodeJs มีเยอะมาก สามารถเข้าไปดูเพิ่มเติมได้ที่ npmjs.org

สามารถเช็คเวอร์ชั่น ของ npm ด้วยคำสั่ง ดังนี้

npm -v

NPM ที่นิยมใช้กันมาก คือ Express แต่ในส่วนของเรา จะใช้ Hapi

Hapi เป็น web application framework บน Node.js ช่วยในการสร้าง server side, route, การติดต่อ database และอื่น ๆ ส่วนตัวหลังจากอ่าน Hapi Document แล้วก็เข้าใจได้ง่ายมาก ๆ พร้อมแล้วก็ Install ได้เลย

จบแล้วสำหรับวันแรก สามารถเข้าไปอ่าน Hapi เพิ่มเติมได้ที่ Hapi.com

วันที่ 2: การใช้ Hapi

หลังจากที่เรา Install Hapi แล้ว จะเห็นว่า Hapi เข้าไปอยู่ใน Node_Modules

ในโฟลเดอร์นี้จะเป็นที่เก็บ Package ทั้งหมดที่เราได้ทำการ Install ไว้ใน Project

ตอนที่เราทำการ Install สังเกตว่า จะพิมพ์ dash dash save ด้วย

npm install hapi --save

ข้อดี คือ มันจะไปอัพเดทไฟล์ใน Package.Json ให้ ซึ่งเวลาทำงานจริง เราไม่จำเป็นต้องอัพโหลดเข้าไปใน Git Repo เมื่อทีมงานคนอื่น ๆ เข้ามา clone ก็เพียงแค่ พิมพ์ npm insall ก็จะดาวน์โหลด package ตาม dependency ที่อยู่ในไฟล์ Package.Json

npm install

กลับมาที่ Hapi ของเรากันต่อ ใน Web Hapijs.com จะมีเมนูสำหรับผู้ที่เริ่มต้นให้ศึกษาและฝึกฝนแบ่งเป็นหัวข้อต่าง ๆ ดังนี้

เราจะมาลองสร้าง Server แบบง่ายเพื่อใช้เป็น API และยิงเพื่อทดสอบการแสดงผลข้อความบน Postman โดยพิมพ์คำสั่งดังนี้

จากมาตรฐาน ES6 => ตัวแปรแต่ตัวมีความสำคัญดังนี้

var คือ การประกาศตัวแปรแบบ Global scopeconst คือ การประกาศตัวแปรแบบค่าคงที่ แก้ไขข้อมูลไม่ได้let คือ การประกาศตัวแปรแบบอยู่ใน scope หรือที่ ๆ ของตัวเอง

ลองรัน Simple Hapi ผ่าน Terminal กันเลย ผ่านคำสั่ง node app.js

ผลลัพธ์ที่ได้ Server กำลัง run ที่ Localhost port 3000 (รักนะ3000)

จากนั้นลองเปิด http://localhost:3000 ผ่าน Postman หน้าตาที่ได้จะประมาณนี้

“Errorrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr คร้าบบบบบบบบบบบบบบบ”

เพราะเรายังไม่ได้ทำการกำหนด Route เส้นทางและ Method เอาไว้

เพิ่มโค้ดส่วนการกำหนด Route และ Method ดังนี้

** อย่าลืมทำการ Stop Server ก่อนนะครับ ไม่งั้นจะเจอ Error: Host is running already **

เราใช้วิธีแบบบ้านๆ คือ เปิด Task Manager แล้ว End Task: node.exe ออก หรือไม่ก็พิมพ์คำสั่ง

taskkill /IM node.exe -F

แล้วทำการทดสอบยิง API อีกครั้ง ผลลัพธ์ที่ได้ คือ เย้ๆๆๆ…. I love Noey BNK48

หรือจะลองรันผ่าน Browser

วันที่ 3: การใช้ HAPI และ Template

สำหรับแสดงผล HTML เราจะใช้ Plugin เพื่อช่วยเราในการเรียกใช้ Template ที่ชื่อว่า Vision และใช้ HTML Engine ที่ชื่อว่า Handlebars ใช้คำสั่ง Install ดังนี้

npm install vision --save
npm install handlebars --save

จากนั้นเราจะทำการสร้าง Simple HTML Template เพื่อใช้ Return HTML ออกไป Rendering ในหน้าจอ Browser
โดยการสร้าง Folder: public/views/index.html

และก็ใส่โค้ด HTML ลงไปสักหน่อย เช่น

จากนั้นทำการเพิ่มโค้ด เพื่อใช้เรียกใช้ Package Vision และ Handlers ที่ App.js

และเพิ่มโค้ด การเรียกใช้ Vision และ Engine View ดังนี้

ลองทำการทดสอบรัน server nodejs กันเลย จากนั้นเรียก http://localhost:3000/home ใน Browser ผลลัพธ์ที่ได้ คือ

(ลองเข้าไปเล่น Riskgame version 3.0 ได้แล้วที่ RiskGame)

วันที่ 4: การติดต่อ MSSQL Database

อย่างที่บอกไปว่าผู้เขียนอยู่ในโลกแห่ง Azure ดังนั้นจะทำการเขียนโค้ดเพื่อเชื่อมต่อฐานข้อมูลกับ Microsoft SQL Server นะครับ เริ่มจากลง Package: mssql ก่อน

ใช้เวลาแปบนึงไม่ต้องตกใจ

npm install mssql --save

หลังจาก Install mssql เรียบร้อยแล้ว =>

  1. สร้างไฟล์ sqlconfig ขึ้นมาเพื่อเก็บข้อมูล ConnectionString (จริง ๆ แล้วใส่ไว้ใน app.js เลยก็ได้) แต่ผู้เขียนชอบความเป็น OOP เลยสร้างไฟล์ Global Config จะช่วยให้การเรียกใช้และดูแลง่ายกว่า

ข้อสังเกต: module.exports มีหน้าที่เก็บค่าต่าง ๆ ไว้เพื่อให้ไฟล์อื่น ๆ สามารถเข้าถึงข้อมูลที่เก็บไว้ในนั้นได้ ในไฟล์ Repository เราจะเรียก sqlConfig กัน

2. สร้าง Repository (ฟังดูคุ้น ๆ นะ) เอาไว้เรียกใช้และเข้าถึงข้อมูลจาก Database และส่ง Data กลับไปให้กับ Api

เริ่มเขียนโค้ดใน Repository

  • เรียกใช้ Package: mssql
  • เรียกใช้ Module Export: sqlConfig
  • สร้าง Method: GetUserById มี Param เป็น UserId จากนั้น return ค่า User

ผู้เขียนใช้ Database ที่มีอยู่แล้ว ชื่อ Table: User ลองเขียน Query ง่ายเรียกข้อมูล User และ Filter ด้วย UserId (Integer)

3. สร้าง Api: GetById ขึ้นมา และเรียกใช้ user repository ตามด้วย Method GetUserById ดังนี้

4. ทดสอบยิง Api ผ่าน Postman ผลลัพธ์ที่ได้ คือ

วันที่ 5: การทำ ORM ด้วย Sequelize

เมื่อเราได้ลองทำ user repository เห็นว่า การเขียน Query Statement ตรง ๆ แบบนั้นดูไม่ค่อยเท่ ไม่ตอบโจทย์การเป็น OOP และไม่ปลอดภัยสักเท่าไร อีกทั้งยังบริหารจัดการยากด้วย ดังนั้น เราเลยต้องหา Package ORM เข้ามาช่วยน่าจะเวิร์คมากกว่า

ORM ( Object Relational Mapping) คือ การเปลี่ยน Database เป็น Object หรือแปลงข้อมูลจาก Database เป็น Object (ไม่ต้องยุ่งกับ Select, Insert, Update, Delete statement)

NodeJs มี Package ที่เป็น ORM ชื่อว่า Sequelize

ไม่รอช้ารีบลง Package Sequelize กันเลย!!

npm install sequelize --save

หลังจาก Install mssql เรียบร้อยแล้ว =>

  1. ไปที่ sqlConfig เพื่อเรียกใช้ Package: Sequelize และกำหนด ConnectionString

2. สร้างไฟล์ dataContext.js เพื่อใช้ทำการ Mapping Object กับ Column ใน Database (Mapping Data: userid, firstname, lastname)

3. ไปที่ User Repository สร้าง Method ชื่อว่า GetUserByIdViaSequelize มี Param คือ userId และเรียกใช้ DataContext.UserMapping ที่เราทำไว้ใน dataContext

จะสังเกตได้ว่ามี Method ที่ชื่อว่า FindByPk มันมาจาก Model Usage ของ Sequelize ให้เราเรียกใช้

4. ไปที่ App.Js สร้าง API ชื่อว่า GetUserByIdViaSequelize

5. ทดสอบยิง Api ผ่าน Postman ผลลัพธ์ที่ได้ คือ

สรุป

5 วันผ่านไป หลังจากได้ทดลองเล่น NodeJs เบื้องต้นแล้ว ความคิดเห็นส่วนตัวคิดว่าก็น่าใช้ดี มีฟังก์ชั่นและลูกเล่นเยอะไม่แพ้ .NET เริ่มต้นการพัฒนาโดยใช้ไฟล์ Resource น้อยมาก อาจจะงง ๆ บ้างในตอนแรก แต่หากเข้าใจ Concept และจับจุดได้ ก็ไม่ยากที่จะใช้ Node JS ในการพัฒนาระบบครับ

ตอนนี้พลังงานหมดแล้ว ไว้พบกับบทความต่อไปครับ

ถ้าสนใจ Hapi เพิ่มเติมสามารถ เข้าไปดาวน์โหลด Source code ตัวอย่างได้ที่ https://github.com/tkssharma/Hapi-js-Training

หัวข้อที่น่าสนใจในการศึกษา NodeJs ต่อไป

  1. Redis
  2. Authentication: JWT2
  3. Data Realtime
  4. IOT
  5. Async/Await, Promise https://www.promisejs.org/
  6. PayLoad
  7. NodeJs via Typescript, React, AngularJs, VueJs
  8. Swagger
  9. Deployment: Docker

--

--