จากตัวอย่างการเขียน 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”]
ขั้นตอน
- จากตอนที่แล้วให้ทำการลบโค้ดในส่วนของการสร้าง 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
ข้อดี
- มีมาตรฐานการเขียนโค้ดส่งพารามิเตอร์เพียงดัวเดียวในทุกๆฟังก์ชั่น
- แยกไฟล์เพื่อจัดหมวดหมู่ให้เป็นระเบียบตามแต่ละเรื่องในอยู่ในโฟลเดอร์นี้ได้ เช่น adminRoute.js ,customerRoute.js, productRoute.js
- มีความเร็วพร้อมใช้งาน เพราะทำการสร้างออบเจคไว้ตั้งแต่ทำการคอมไพล์
ข้อเสีย
- หากมี route มาก แต่สร้างมาทั้งหมดตั้งแต่แรก บาง route อาจจะไม่ได้ถูกเรียกใช้งานบ่อยนัก
- จองเนื่อที่ในหน่วยความจำตามจำนวน route ที่มีการสร้างไว้
- เมื่อมี route มากก็จะทำให้คอมไพล์ช้าลง และจองทรัพยากรไว้โดยไม่จำเป็น
ผู้เขียนใช้วิธีนี้สำหรับโครงการขนาดเล็กและกลาง เคยใช้สูงสุดหลักพัน route ด้วยเครื่องเสปค core i3 ก็ใช้เวลาคอมไพล์โปรเจคไม่กี่วินาที เหมาะสำหรับมือใหม่ที่ต้องการความสะดวก แต่ปัจจุบันไม่ได้ใช้วิธีนี้แล้ว ใช้วิธีการทำ dynamic single route คือมี route เดียวทั้งโปรเจคมีการเรียกใช้ฟังก์ชั่นไหนก็ค่อยสร้างขึ้นมา และทำการทำลายออบเจคนั้นเมื่อเลิกใช้
พบกับตอนที่ 7 การเขียนโค้ดแบบ Callback