DEV Community

Akkarapon Phikulsri
Akkarapon Phikulsri

Posted on

NodeJS 101 —  Part 2 💾MySQL

เนื้อหาดังต่อไปนี้เป็นเนื้อหาเมื่อปี 2023 ถูกปรับปรุงเรียบเรียงใหม่ 2026 ขอให้สนุกกับการเริ่มต้นกับโลก Programming อย่างภาษาง่าย ๆ ด้วย JavaScript กันเน่อ :)

🚀 การสร้าง API โดยใช้ JavaScript Node.js Express

คู่มือการพัฒนา RESTful API แบบครบวงจรด้วย Node.js, Express, Sequelize และ MySQL

📖 คำนำ

เอกสารฉบับนี้เป็นการพัฒนา web service หรือ RESTful API โดยใช้ภาษา JavaScript Node.js ร่วมกับเฟรมเวิร์กและไลบรารี่ต่าง ๆ ได้แก่:

  • 🌐 Express HTTP Framework - สำหรับสร้าง web server
  • 🗄️ Sequelize - ORM สำหรับจัดการฐานข้อมูล
  • 💾 MySQL - ฐานข้อมูลเชิงสัมพันธ์
  • 🔧 POSTMAN - สำหรับทดสอบ API

Module 2: 💾 Basic API MySQL

เรียนรู้การเชื่อมต่อและใช้งาน MySQL Database กับ Express


Section 2-1 - 🚀 Create New App Express and MySQL

📁 สร้างโปรเจกต์ใหม่

1. สร้างโฟลเดอร์ demo-mysql
mkdir demo-mysql
Enter fullscreen mode Exit fullscreen mode
2. เข้าไปในโฟลเดอร์ demo-mysql
cd demo-mysql
Enter fullscreen mode Exit fullscreen mode

⚠️ หมายเหตุ: คำสั่ง cd mkdir demo-mysql ในเอกสารเดิมไม่ถูกต้องนะครับ ควรใช้ cd demo-mysql หลังจากสร้างโฟลเดอร์แล้ว

3. สร้าง Node.js Application
npm init -y
Enter fullscreen mode Exit fullscreen mode

คำสั่งนี้จะสร้างไฟล์ package.json อัตโนมัติ


📄 สร้างไฟล์ index.js

ไฟล์: index.js

const express = require('express')
const cors = require('cors')  // ⚠️ แก้ไข: ควรเป็น 'cors' ไม่ใช่ 'express'
const PORT = process.env.PORT || 5000
const app = express()

app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use(cors())

app.listen(PORT, () => {
    console.log(`CORS enabled server listening on ${PORT}`)
})
Enter fullscreen mode Exit fullscreen mode

⚠️ หมายเหตุ: ในโค้ดเดิมมีการ require('express') สำหรับ cors ซึ่งไม่ถูกต้องนะครับ ควรเป็น require('cors')


📦 ติดตั้ง Packages ที่จำเป็น

ติดตั้ง Packages หลัก
npm install express mysql2 cors --save
Enter fullscreen mode Exit fullscreen mode
ติดตั้ง Nodemon สำหรับ Development

Development Dependencies:

npm install -D nodemon
Enter fullscreen mode Exit fullscreen mode

Global Installation (Optional):

npm install -g nodemon
Enter fullscreen mode Exit fullscreen mode
📋 Packages ที่ติดตั้ง:
Package Description
express Web framework สำหรับ Node.js
mysql2 MySQL client สำหรับ Node.js
cors Middleware สำหรับจัดการ Cross-Origin Resource Sharing
nodemon Auto-restart server เมื่อมีการแก้ไขไฟล์

Section 2-2 - 🔌 Connect MySQL Database

📦 Import MySQL2

เพิ่มในไฟล์: index.js

const mysql = require('mysql2');
Enter fullscreen mode Exit fullscreen mode

🔌 เชื่อมต่อฐานข้อมูล MySQL

วิธีที่ 1: ใช้ค่าคงที่
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'basic_api_express_db'
});
Enter fullscreen mode Exit fullscreen mode
วิธีที่ 2: ใช้ Environment Variables (แนะนำ) ⭐
const connection = mysql.createConnection({
    host: process.env.DB_HOSTNAME || 'localhost',
    user: process.env.DB_USERNAME || 'root',
    password: process.env.DB_PASSWORD || '',
    database: process.env.DB_DATABASE || 'basic_api_express_db'
});
Enter fullscreen mode Exit fullscreen mode

💡 แนะนำ: ใช้วิธีที่ 2 เพื่อความปลอดภัยและยืดหยุ่นในการ deploy


📥 ทดสอบดึงข้อมูลจากฐานข้อมูล

เพิ่มในไฟล์: index.js

// Get all users
app.get('/users', (req, res, next) => {
    try {
        connection.query(
            'SELECT * FROM `users`',
            (err, results, fields) => {
                if (err) {
                    return res.status(500).json({ message: "Database error", error: err });
                }
                res.status(200).json(results);
            }
        );
    } catch (error) {
        res.status(400).json({ message: "get user was failed", error: error.message });
    }
})

// Get user by id
app.get('/users/:id', (req, res, next) => {
    try {
        const id = req.params.id;
        connection.query(
            'SELECT * FROM `users` WHERE `id` = ?',
            [id],
            (err, results) => {
                if (err) {
                    return res.status(500).json({ message: "Database error", error: err });
                }
                if (results.length === 0) {
                    return res.status(404).json({ message: "User not found" });
                }
                res.status(200).json({ payload: results });
            }
        );
    } catch (error) {
        res.status(400).json({ message: "get user by id was failed", error: error.message });
    }
})
Enter fullscreen mode Exit fullscreen mode
🧪 ทดสอบ API
GET http://localhost:5000/users
GET http://localhost:5000/users/1
Enter fullscreen mode Exit fullscreen mode

Section 2-3 - ➕ CREATE USER

➕ สร้าง User ใหม่

เพิ่มในไฟล์: index.js

app.post('/users', (req, res, next) => {
    try {
        const { fname, lname, username, password, avatar } = req.body;

        connection.query(
            'INSERT INTO `users`(`fname`, `lname`, `username`, `password`, `avatar`) VALUES (?, ?, ?, ?, ?)',
            [fname, lname, username, password, avatar],
            (err, results) => {
                if (err) {
                    return res.status(500).json({ 
                        message: "create user was failed", 
                        error: err.message 
                    });
                }
                res.status(201).json({ 
                    message: "create user was successfully", 
                    payload: results 
                });
            }
        );
    } catch (error) {
        res.status(400).json({ 
            message: "create user was failed", 
            error: error.message 
        });
    }
})
Enter fullscreen mode Exit fullscreen mode
🔍 อธิบายโค้ด:
  • INSERT INTO - คำสั่ง SQL สำหรับเพิ่มข้อมูล
  • ? - Placeholder สำหรับป้องกัน SQL injection
  • status(201) - HTTP status code สำหรับการสร้างข้อมูลสำเร็จ
🧪 ทดสอบ API
POST http://localhost:5000/users
Content-Type: application/json

{
  "fname": "John",
  "lname": "Doe",
  "username": "johndoe",
  "password": "password123",
  "avatar": "https://example.com/avatar.jpg"
}
Enter fullscreen mode Exit fullscreen mode

Section 2-4 - ✏️ UPDATE USER

✏️ อัปเดตข้อมูล User

เพิ่มในไฟล์: index.js

app.put('/users/:id', (req, res, next) => {
    try {
        const id = req.params.id;
        const { fname, lname, username, password, avatar } = req.body;

        connection.query(
            'UPDATE `users` SET `fname`= ?, `lname`= ?, `username`= ?, `password`= ?, `avatar`= ? WHERE id = ?',
            [fname, lname, username, password, avatar, id],
            (err, results) => {
                if (err) {
                    return res.status(500).json({ 
                        message: "update user was failed", 
                        error: err.message 
                    });
                }
                if (results.affectedRows === 0) {
                    return res.status(404).json({ 
                        message: "User not found" 
                    });
                }
                res.status(200).json({ 
                    message: "update user was successfully", 
                    payload: results 
                });
            }
        );
    } catch (error) {
        res.status(400).json({ 
            message: "update user was failed", 
            error: error.message 
        });
    }
})
Enter fullscreen mode Exit fullscreen mode
🔍 อธิบายโค้ด:
  • UPDATE - คำสั่ง SQL สำหรับอัปเดตข้อมูล
  • affectedRows - จำนวนแถวที่ถูกอัปเดต (0 = ไม่พบข้อมูล)
🧪 ทดสอบ API
PUT http://localhost:5000/users/1
Content-Type: application/json

{
  "fname": "Jane",
  "lname": "Doe",
  "username": "janedoe",
  "password": "newpassword123",
  "avatar": "https://example.com/new-avatar.jpg"
}
Enter fullscreen mode Exit fullscreen mode

Section 2-5 - 🗑️ DELETE USER

🗑️ ลบข้อมูล User

เพิ่มในไฟล์: index.js

app.delete('/users/:id', (req, res, next) => {
    try {
        const id = req.params.id;

        connection.query(
            'DELETE FROM `users` WHERE id = ?',
            [id],
            (err, results) => {
                if (err) {
                    return res.status(500).json({ 
                        message: "delete user was failed", 
                        error: err.message 
                    });
                }
                if (results.affectedRows === 0) {
                    return res.status(404).json({ 
                        message: "User not found" 
                    });
                }
                res.status(200).json({ 
                    message: "delete user was successfully", 
                    payload: results 
                });
            }
        );
    } catch (error) {
        res.status(400).json({ 
            message: "delete user was failed", 
            error: error.message 
        });
    }
})
Enter fullscreen mode Exit fullscreen mode
🔍 อธิบายโค้ด:
  • DELETE FROM - คำสั่ง SQL สำหรับลบข้อมูล
  • affectedRows - จำนวนแถวที่ถูกลบ (0 = ไม่พบข้อมูล)
🧪 ทดสอบ API
DELETE http://localhost:5000/users/1
Enter fullscreen mode Exit fullscreen mode

🎉 สรุป Module 2

เราได้เรียนรู้การเชื่อมต่อและใช้งาน MySQL Database กับ Express ครบทั้ง CRUD Operations:

Method Endpoint Description
GET /users ดึงข้อมูล users ทั้งหมด
GET /users/:id ดึงข้อมูล user ตาม id
POST /users สร้าง user ใหม่
PUT /users/:id อัปเดตข้อมูล user
DELETE /users/:id ลบ user

Reference

GitHub logo akkaraponph / basic-nodejs-express-sequelize-mysql

สร้าง API โดยใช้ JavaScript Node.js Express

หมายเหตุ Tutorial นี้ได้จัดทำขึ้นเมื่อ (April 4th, 2023) และได้รับการปรับปรุงเมื่อ (January 8th, 2026)

🚀 การสร้าง API โดยใช้ JavaScript Node.js Express

Node.js Express MySQL Sequelize

คู่มือการพัฒนา RESTful API แบบครบวงจรด้วย Node.js, Express, Sequelize และ MySQL

⬆ กลับไปด้านบน📚 สารบัญ


📖 คำนำ

เอกสารฉบับนี้เป็นการพัฒนา web service หรือ RESTful API โดยใช้ภาษา JavaScript Node.js ร่วมกับเฟรมเวิร์กและไลบรารี่ต่าง ๆ ได้แก่:

  • 🌐 Express HTTP Framework - สำหรับสร้าง web server
  • 🗄️ Sequelize - ORM สำหรับจัดการฐานข้อมูล
  • 💾 MySQL - ฐานข้อมูลเชิงสัมพันธ์
  • 🔧 POSTMAN - สำหรับทดสอบ API

📚 สารบัญ

Top comments (0)