วิธีการใช้งาน MySQL และ Async/Await ด้วย Koa บน Node.js application.

วิธีการใช้งาน MySQL และ Async/Await ด้วย Koa บน Node.js application.

ผู้ใช้ทั้งเก่าและใหม่ - ไม่น่าแปลกใจเลยที่ในฐานะผู้ใช้งาน MySQL ซึ่งเป็นระบบฐานข้อมูลที่มีมานาน ต้องการที่จะมองหา Koa ซึ่งเป็น framework ใหม่มาประยุกต์ใช้ในระบบฐานข้อมูล เริ่มสนใจแล้วใช่ไหมครับ? งั้นเรามาดูกระบวนการนำ Koa ไปเริ่มใช้งานกันเลยดีกว่า.


เริ่ม Koa - ถ้าคุณต้องการเริ่มต้นตัวอย่าง สักหนึ่ง project นึงให้ทำการ check out ที่ GitHub นี้ เมื่อเรียบร้อยก็คุณเข้าสามารถเริ่มต้นใช้ Koa ได้แล้ว.

ติดตั้ง Node-MySQL - ซึ่งการติดตั้ง Node-MySQL นั้น มีให้เลือกให้เราใช้บางเวอร์ชั่น ในที่นี้เราใช้ promise-mysql ซึ่งข้อดีในคือสามารถเรียกใช้ promises ได้ ในการเรียกใช้ฐานข้อมูล และดีที่สุดคือใช้ documentation ของ Node-MySQL.

npm install promise-mysql

ถัดไปเราจำเป็นต้องสร้างไฟล์ db.js ซึ่งเราจะวางในโฟลเดอร์ที่เราได้สร้างส่วนไดเร็กทรอรีของ src. 

ถึงตรงนี้เรามาสร้าง connection pool สำหรับฐานข้อมูลใน db.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import mysql from 'promise-mysql';
import {} from 'dotenv/config';

const config = {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE,
    connectionLimit: 100,
};

const pool = mysql.createPool(config);

export default pool;

ในโค้ดข้างบนนั้นเรากำลังใช้ packing ของ dotenv เพื่อเข้าถึงข้อมูล ในฐานข้อมูลที่เราได้เก็บไว้ใน .env ไฟล์ แนะนำว่าเราไม่ต้องทำการ hardcode เพื่อที่จะได้ username และ password ของฐานข้อมูล

อย่างที่เราได้เห็น โค้ดได้อธิบายตัวมันเอแล้ว เราส่งออกตัวแปร pool  ที่เราสร้างเพื่อให้เราสามารถใช้โมเดลข้อมูลของเราได้เลย

ดังนั้น สมมุติว่าเราต้องเรียกฐานข้อมูลเพื่อที่จะหาบางรายการโดยใช้ id คุณสามารถทำได้ด้งนี้

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//From your router

router.get('/item/:id', async (ctx, next) => {
    let item = await show(ctx.params.id);
    ctx.body = item;
})

//In your controller/model

import pool from '../db/db';

async show(id) {
    try {
        //Find item
        let itemData = await pool.query(
            "
            SELECT id, title, content
            FROM items
            WHERE id = ?
            ",
            [id]
        );
        return itemData[0];
    } catch (error) {
        console.log(error);
        ctx.throw(400, 'INVALID_DATA');
    }
}

ถ้าเราดูทีละส่วนในนี้ จะพบว่าเราได้ใช้ async และ await แทน .then ในฟังก์ชั่นของ promise ได้เลย ถ้าคุณเห็นมันเป็นครั้งแรก ผมแนะนำให้อ่านเพิ่มเติมตาม link นี้ โดยพื้นฐานแล้ว จะให้คุณใช้กลุ่มคำสั่ง try/catch ในการ run promise ของคุณ และช่วยให้หลีกเลี่ยงการใช้ callback-hell 

ใน router ที่เราใช้ได้ run show() ซึ่งฟังก์ชั่นนี้ได้ส่งค่ากลับนั้นจะได้มาจาก promise และ Koa จะตอบสนองต่อค่านั้นๆที่ได้คืนมานั้นเอง.

เมื่อ show() ทำงาน กลุ่มคำสั่ง try/catch จะถูกทำงานและพยายามที่จะ SELECT จากฐานข้อมูล อย่างที่เราได้เห็น เราแค่วาง await ไว้ข้างหน้า pool.quere ของเรา ส่วน package ของ node-mysql จะถูก escape อย่างที่คุณเห็น เครื่องหมาย ? อยู่ตำแหน่งใดของ statement นั้นคือจะให้ค่าตัวแปร id มาใส่ในตอนท้ายด้วย.

จากนั้นเราก็จะสามารถส่งค่าที่เราตอบสนองคืนกลับไปยัง router ได้อย่างง่ายดาย. ซึ่งผมได้ใส่วิธีการ route ที่ต่างกันออกไปใน demo Koa app แต่นั้นผมต้องการที่จะกระชับคำสั่งให้ง่ายต่อการเข้าใจ.

เพียงเท่านี้ คุณก็จะได้วิธีการสร้าง MPA ด้วยตัวคุณเองแล้ว! เพื่อแน่ใจว่าได้เข้าถึงฟังก์ชั่นการใช้งานที่มีอยู่ใน node-mysql อย่างครบถ้วนแล้วให้คุณลองเข้าไปศึกษาที่ https://github.com/mysqljs/mysql และเมื่อหลังจากที่คุณได้ใช้งาน PDO ใน PHP มาแรมปี คุณจะเห็นว่าการเข้าถึง package นี้มีความสมบูรณ์ยิ่งขึ้นและน่าใช้มากขึ้น

เตรียมพบกับหลักสูตร WEEKEND COURSE (NODE.JS) เรียนกัน 6 เดือน

Codecamp

  1. คอร์สเรียนเสาร์-อาทิตย์
  2. ฝึกงานกับบริษัทจริง หรือ
    เลือกทำ Project จากบ้านก็ได้
  3. Speed Dating Day เลือกบริษัทที่ใช่กว่า 30 บริษัท
  4. เวลาปรึกษา TA Online ผ่าน Google Hangout ได้

รายละเอียดเพิ่มเติม คลิกที่นี่