ตัวอย่าง Nodejs Express Rest Api ตอนที่ 3



ในส่วนนี้เราจะทำการสร้างไฟล์ todo.js และไฟล์ route.js ที่อยู่ในไดเรกทอรี api_v1/todo โดยจะสร้างไฟล์
todo.js ก่อนให้ทำการโดยการสร้างฟังก์ชันที่เรียกใช้งานไฟล์ mock.js ที่เราสร้างไว้ก่อนหน้านี้  ลักษณะการ
สร้างจะเป็นการครอบฟังก์ชันที่มาจากไฟล์ mock.js อีกทีหนึ่ง  การครอบในที่นี้เช่น สร้างฟังก์ชัน addTodo ที่ไป
เรียกใช้ฟังก์ชัน addTodo จากไฟล์ mock.js อีกทีหนึ่ง ต่อไปก็ไปดูโค้ดตามตัวอย่างด้านล่างนี้

todo.js

module.exports = class Todo {
    constructor() {
        let Query = require('./database/mock');
        this.query = new Query();
    }

    getAllTodo(){
        return new Promise( async (resolve, reject) => {
            let query = this.query;
            try {
                let result = await query.getAllTodo();
                resolve(result);
            } catch (err) {
                reject(err.toString());
            }
        });
    }

    getTodo(ctx){
        return new Promise( async (resolve, reject) => {
            let query = this.query;
            try {
                let result = await query.getTodo(ctx);
                resolve(result);
            } catch (err) {
                reject(err.toString());
            }
        });
    }

    addTodo(ctx){
        return new Promise( async (resolve, reject) => {
            let query = this.query;
            try {
                let result = await query.addTodo(ctx);
                let newTodo = await query.getTodo({id: result.newId});
                resolve({status: result.status, newTodo: newTodo});
            } catch (err) {
                reject(err.toString());
            }
        });
    }

    updateTodo(ctx){
        return new Promise( async (resolve, reject) => {
            let query = this.query;
            try {
                let result = await query.updateTodo(ctx);
                let updatedTodo = await query.getTodo({id: result.updatedId})
                resolve({status: result.status, updatedTodo: updatedTodo});
            } catch (err) {
                reject(err.toString());
            }
        });
    }

    deleteTodo(ctx){
        return new Promise( async (resolve, reject) => {
            let query = this.query;
            try {
                let result = await query.deleteTodo(ctx);
                resolve(result);
            } catch (err) {
                reject(err.toString());
            }
        });
    }
}

จากโค้ดด้านบนเป็นการสร้าง class ชื่อ Todo แล้วมีการเรียกใช้งานไฟล์ mock.js ในฟังก์ชัน contructor
ฟังก์ชันทั้งหมดสร้างโดยการตั้งชื่อเหมือนกับฟังก์ชันในไฟล์ mock.js เลย  แล้วโค้ดข้างในแต่ละฟังก์ชันก็เรียก
ใช้งานฟังก์ชันในไฟล์ mock.js ตามชื่อเลยด้วย  การออกแบบโครงสร้างโค้ดแบบนี้จะมีประโยชน์ในการใช้งาน
เชื่อมต่อกับระบบ database โดยเรามองว่าไฟล์ mock.js เป็นฟังก์ชันพื้นฐานที่เชื่อมต่อกับ database ส่วนไฟล์
todo.js นี้จะนำฟังก์ชันพื้นฐานเหล่านั้นมาประยุกต์ใช้  ถ้าหากว่ามีการใช้งานกับ database แบบซับซ้อนจริงๆเรา
ก็สร้างฟังก์ชันเฉพาะทางในไฟล์ mock.js แล้วให้ไฟล์ todo.js มาเรียกใช้งานต่อได้  ตัวอย่างที่ทำให้เห็นชัดๆใน
ไฟล์นี้ดูได้ที่ฟังก์ชัน addTodo และ updateTodo 

   
addTodo(ctx){
        return new Promise( async (resolve, reject) => {
            let query = this.query;
            try {
                let result = await query.addTodo(ctx);
                let newTodo = await query.getTodo({id: result.newId});
                resolve({status: result.status, newTodo: newTodo});
            } catch (err) {
                reject(err.toString());
            }
        });
    }



จากโค้ดด้านบนเป้นฟังก์ชัน addTodo ที่อยู่ในไฟล์ todo.js จะเห็นได้ว่าไม่ได้แต่เรียกใช้ฟังก์ชัน addTodo
เฉยๆแต่มีการเรียกใช้ฟังก์ชัน getTodo ด้วย  เพราะว่าได้ออกแบบไว้ว่าให้มีการคืนค่า id ของ todo ที่สร้างเสร็จ
แล้วด้วย  นี่เป็นเพียงตัวอย่างเล็กๆ  ถ้าหากเจอโจทย์ที่ซับซ้อนขึ้น เช่น ให้แสดงข้อมูลของโรงเรือนพร้อมทั้ง
แสดงข้อมูลของผู้ดูแลและวงรอบการเลี้ยงสัตว์ในโรงเรือน  เราอาจใช้คำสั่ง query ในฐานข้อมูลก็ได้หรือจะใช้วิธี
สร้างฟังก์ชันพื้นฐานแบบตัวอย่างข้างบนและสร้างอีกไฟล์หนึ่งมาครอบแล้วประยุกต์ใช้ก็ทำให้สะดวกมากขึ้น


ความคิดเห็น