บทความนี้ เป็นการแนะนำการ Setup โครงสร้างโปรเจคสำหรับสร้าง RESTFul API ด้วย Node.js และ Express.js เชื่อว่าคนที่เคยเขียน API ด้วย Express ต้องเคยเจอปัญหาว่าจะสร้างโครงสร้างของโปรเจคอย่างไรดี เนื่องจากทาง Express ไม่มีรูปแบบที่แนะนำ ทำให้การพัฒนาเป็นไปอย่างหลากหลาย ตามความถนัดของแต่ละคน หรือแต่ละทีมตามที่ตกลงกัน ซึ่งบทความนี้จะแนะนำการวางโครงสร้างโปรเจคที่จะทำให้การพัฒนาง่าย และเป็นระบบระเบียบมากขึ้น ไปดูกันเลย++
สำหรับ Packages ทั้งหมดที่ใช้ในบทความนี้ (ซึ่งสามารถปรับ เพิ่ม-ลด ได้ตามความเหมาะสมของงาน)
{
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-jwt": "^5.3.1",
"express-session": "^1.17.0",
"moment": "^2.24.0",
"mongoose": "^5.7.13",
"mongoose-unique-validator": "^2.0.3",
"morgan": "^1.9.1",
"passport": "^0.4.0",
"passport-jwt": "^4.0.0",
"passport-local": "^1.0.0"
},
"scripts": {
"start": "nodemon app.js"
}
}
รายละเอียดของแต่ละ packages ดังนี้
- cors สำหรับจัดการเกี่ยวกับ Connection ระหว่าง Client และ Server
- dotenv สำหรับจัดการเกี่ยวกับ Environment Variable
- express สำหรับจัดการเกี่ยวกับ Request ต่างๆ
- express-jwt สำหรับจัดการเกี่ยวกับการ Validates JsonWebTokens
- express-session สำหรับจัดการเกี่ยวกับ Session
- moment สำหรับจัดการเกี่ยวกับเวลา
- mongoose สำหรับเป็นเครื่องมือจัดการเกี่ยวกับ Object Model ของ MongoDB
- mongoose-unique-validator สำหรับจัดการเกี่ยวกับการ Validate field ของ Mongoose Schema
- morgan สำหรับจัดการเกี่ยวกับ Log
- passport สำหรับจัดการเกี่ยวกับรูปแบบการยืนยันตัวตน
- passport-jwt สำหรับจัดการเกี่ยวกับการยืนยันตัวตนด้วย Token
- passport-local สำหรับการยืนยันตัวตนด้วย email/password
Directory Structure
app.js # App entry point└─── configs # Configuration related stuff└─── controllers # Controllers for all the endpoints└─── helpers # Utility function└─── models # Object Models└─── public # Static file└─── routes # Routes for all the endpoints└─── services # Business logic
รายละเอียดของแต่ละโฟลเดอร์ ดังนี้
- configs สำหรับไฟล์ config ต่างๆ
- controllers สำหรับควบคุมการทำงานของการร้องขอ
- helpers สำหรับฟังก์ชั่นที่ใช้ร่วมกัน (common)
- public สำหรับเก็บไฟล์ หรือรูปภาพ
- routes สำหรับกำหนด เส้นทางการร้องขอ (Request)
- services สำหรับตรรกะ การคำนวณ ต่างๆ (Logic)
สำหรับการทำงานนั้นจะเน้นไปที่การสร้าง module แล้ว export เพื่อให้ส่วนต่างๆ สามารถเรียกใช้งานได้ หากต้องการแก้ไขส่วนไหน ก็จะสามารถทำได้ง่าย เพราะทุกส่วนจะแยกออกจากกันอย่างชัดเจน ทำให้โค้ดเราดู clean และดูเป็นระเบียบมากยิ่งขึ้นด้วย สามารถโหลด source code ไปลองใช้ดูได้เลยครับ
แนวคิดคือ แยกโฟลเดอร์ออกเป็นส่วนๆ ตามการใช้งาน และ Export module ให้ส่วนอื่นๆเรียกใช้งานได้