Project Structure of RESTFul API with Express.js on Node.js

NottDev
2 min readDec 13, 2019

บทความนี้ เป็นการแนะนำการ 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 ให้ส่วนอื่นๆเรียกใช้งานได้

Source code Github

--

--