NodeJS ตอนที่ 6 [เทคนิคการเขียน Route แยก หลายๆไฟล์]

จากตัวอย่างการเขียน Route URIs ของการเขียน RestApi ในตอนที่แล้วนั้น มีเพียง 4 route เท่านั้น คือ /get,/add,/edit และ /delete แต่ในชีวิตจริงแอพหนึ่งแอพมีเป็น 100 route ขึ้นไปแน่นอนตามขนาดแอพ แอพใหญ่ๆอาจจะมีมากถึงหมื่นเลยทีเดียว ส่วนผมเองเคยแตะถึงระดับพันต้นๆเท่านั้น เมื่อมี route มากขึ้น หากมาเขียนไว้ในไฟล์ๆเดียว หากในบริษัทมีคนพัฒนา Api หลายคนคงต้องปวดหัวในการแก้ไขไฟล์หลักนี้แน่นอน ถึงแม้ปัจจุบันมีเครื่องมือในการคอนโทรลเวอร์ชั่นดีๆอย่าง svn และ github ในตอนนี้เราจะมาแก้ไขปัญหานี้แบบง่ายๆ

[img class=”aligncenter” src=”/wp-content/uploads/2016/02/confuse.gif”]

ขั้นตอน

  1. จากตอนที่แล้วให้ทำการลบโค้ดในส่วนของการสร้าง route ออก บันทึกในไฟล์ใหม่ชื่อ ch6_snippets.js ดังนี้
var express = require("express");
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.data =[];

//แทรกโค้ดสำหรับตอนที่ 6 ตั้งแต่ตรงนี้

app.listen(3000);
console.log("My Service is listening to port 3000.");

2. สร้างโฟลเดอร์ใหม่ชื่อ snippets สำหรับเก็บ Route ต่างๆ

3. สร้างไฟล์ใหม่ในโฟลเดอร์ snippets ชื่อ sampleRoutes.js

4. ป้อนโค้ดใน sampleRoutes.js ดังนี้

module.exports = function (app){
	app.get('/get', function (req, res) {
	  console.log('get data');
	  res.send(app.data);
	});

	app.post('/add', function (req, res) {
		console.log('add data');
		req.body.id = app.data.length +1;
		app.data.push(req.body);
		res.send(app.data);
	});

	app.put('/edit', function (req, res) {
	  if(req.body.id)
		app.data[req.body.id-1] = req.body;
	  console.log("edit data!");
	  res.send(app.data);
	});

	app.delete('/delete', function (req, res) {
	  if(req.body.id)
		app.data.splice(req.body.id-1,1);
	  console.log("delete data!");
	  res.send(app.data);
	});
}

5. ที่ไฟล์ ch6_snippets.js แทรกโค้ดต่อจากคอมเมนท์ส่วนที่ระบุไว้ ดังนี้

var fs = require ('fs');
fs.readdirSync('snippets').forEach(function(file) {
  if ( file[0] == '.' ) return;
  var routeName = file.substr(0, file.indexOf('.'));
  require('./snippets/' + routeName)(app);
});

6. รันใน Terminal node ch6_snippets.js

node ch6_snippets.js

7. ทดสอบฟังก์ชั่นใน Postman แบบเดียวกับ ตอนที่แล้ว

อธิบายโค้ด

ที่ไฟล์ ch6_snippets.js

var fs = require ('fs');

เรียกใช้ไลบรารี่ fs ย่อมาจาก file system ซึ่ง nodejs ได้พัฒนามาให้สำหรับจัดการเกี่ยวกับการอ่านเขียนไฟล์และไดเรคทอรี่

fs.readdirSync('snippets').forEach(function(file) {
  if ( file[0] == '.' ) return;
  var routeName = file.substr(0, file.indexOf('.'));
  require('./snippets/' + routeName)(app);
});
  • fs.readdirSync(‘snippets’).forEach อ่านไฟล์ในไดเรคทอรี่ snippets ทีละไฟล์แบบเสร็จหนึ่งไฟล์จึงจะอ่านไฟล์ถัดไป
  • if ( file[0] == ‘.’ ) return; ถ้าชื่อไม่มีชื่อไฟล์ให้ข้ามไปตัวถัดไป
  • var routeName = file.substr(0, file.indexOf(‘.’));เอาเฉพาะชื่อไฟล์
  • require(‘./snippets/’ + routeName)(app); ประกาศเรียกใช้ module ต่างๆภายในโฟลเดอร์ snippets

ข้อดี

  1. มีมาตรฐานการเขียนโค้ดส่งพารามิเตอร์เพียงดัวเดียวในทุกๆฟังก์ชั่น
  2. แยกไฟล์เพื่อจัดหมวดหมู่ให้เป็นระเบียบตามแต่ละเรื่องในอยู่ในโฟลเดอร์นี้ได้ เช่น adminRoute.js ,customerRoute.js, productRoute.js
  3. มีความเร็วพร้อมใช้งาน เพราะทำการสร้างออบเจคไว้ตั้งแต่ทำการคอมไพล์

ข้อเสีย

  1. หากมี route มาก แต่สร้างมาทั้งหมดตั้งแต่แรก บาง route อาจจะไม่ได้ถูกเรียกใช้งานบ่อยนัก
  2. จองเนื่อที่ในหน่วยความจำตามจำนวน route ที่มีการสร้างไว้
  3. เมื่อมี route มากก็จะทำให้คอมไพล์ช้าลง และจองทรัพยากรไว้โดยไม่จำเป็น

ผู้เขียนใช้วิธีนี้สำหรับโครงการขนาดเล็กและกลาง เคยใช้สูงสุดหลักพัน route ด้วยเครื่องเสปค core i3 ก็ใช้เวลาคอมไพล์โปรเจคไม่กี่วินาที เหมาะสำหรับมือใหม่ที่ต้องการความสะดวก แต่ปัจจุบันไม่ได้ใช้วิธีนี้แล้ว ใช้วิธีการทำ dynamic single route คือมี route เดียวทั้งโปรเจคมีการเรียกใช้ฟังก์ชั่นไหนก็ค่อยสร้างขึ้นมา และทำการทำลายออบเจคนั้นเมื่อเลิกใช้

พบกับตอนที่ 7 การเขียนโค้ดแบบ Callback