NodeJS 101 — Part 2 MySQL
Source: Dev.to
📖 คำนำ
เอกสารฉบับนี้เป็นการพัฒนา web service หรือ RESTful API โดยใช้ภาษา JavaScript (Node.js) ร่วมกับเฟรมเวิร์กและไลบรารีต่าง ๆ ได้แก่
- 🌐 Express – HTTP framework สำหรับสร้างเว็บเซิร์ฟเวอร์
- 🗄️ Sequelize – ORM สำหรับจัดการฐานข้อมูล
- 💾 MySQL – ฐานข้อมูลเชิงสัมพันธ์
- 🔧 POSTMAN – เครื่องมือทดสอบ API
📚 สารบัญ
Module 2: 💾 Basic API MySQL
เรียนรู้การเชื่อมต่อและใช้งาน MySQL Database กับ Express
Section 2‑1 – 🚀 Create New App Express and MySQL
📁 สร้างโปรเจกต์ใหม่
-
สร้างโฟลเดอร์
demo-mysqlmkdir demo-mysql -
เข้าไปในโฟลเดอร์
demo-mysqlcd demo-mysql⚠️ หมายเหตุ: คำสั่ง
cd mkdir demo-mysqlที่ปรากฏในเอกสารเดิมไม่ถูกต้อง ควรใช้cd demo-mysqlหลังจากสร้างโฟลเดอร์แล้ว -
สร้าง Node.js Application
npm init -yคำสั่งนี้จะสร้างไฟล์
package.jsonอัตโนมัติ
📄 สร้างไฟล์ index.js
const express = require('express');
const cors = require('cors'); // ✅ ใช้แพคเกจ cors แทนการ require('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}`);
});
⚠️ หมายเหตุ: โค้ดเดิมใช้ require('express') สำหรับ cors ซึ่งไม่ถูกต้อง ควรใช้ require('cors')
📦 ติดตั้ง Packages ที่จำเป็น
Packages หลัก
npm install express mysql2 cors --save
Development Dependency – Nodemon
npm install -D nodemon
หากต้องการติดตั้งแบบ global (ไม่บังคับ)
npm install -g nodemon
📋 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');
🔌 เชื่อมต่อฐานข้อมูล MySQL
วิธีที่ 1 – ใช้ค่าคงที่
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'basic_api_express_db'
});
วิธีที่ 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'
});
💡 แนะนำ: ใช้วิธีที่ 2 เพื่อความปลอดภัยและความยืดหยุ่นในการ deploy
📥 ทดสอบดึงข้อมูลจากฐานข้อมูล
เพิ่มโค้ดต่อไปนี้ใน index.js
// Get all users
app.get('/users', (req, res) => {
try {
connection.query('SELECT * FROM `users`', (err, results) => {
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 users failed", error: error.message });
}
});
// Get user by id
app.get('/users/:id', (req, res) => {
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 failed", error: error.message });
}
});
🧪 ทดสอบ API
GET http://localhost:5000/users
GET http://localhost:5000/users/1
Section 2‑3 – ➕ CREATE USER
(เนื้อหายังไม่ได้ระบุ – ใส่โค้ดและคำอธิบายต่อไปนี้ตามต้องการ)
Section 2‑4 – ✏️ UPDATE USER
(เนื้อหายังไม่ได้ระบุ – ใส่โค้ดและคำอธิบายต่อไปนี้ตามต้องการ)
Section 2‑5 – 🗑️ DELETE USER
(เนื้อหายังไม่ได้ระบุ – ใส่โค้ดและคำอธิบายต่อไปนี้ตามต้องการ)
หมายเหตุ: หากต้องการเพิ่มส่วนของการสร้าง, แก้ไข, และลบผู้ใช้ ให้ทำตามรูปแบบของ GET /users และ GET /users/:id โดยใช้ INSERT, UPDATE, DELETE ผ่าน connection.query พร้อมจัดการ error handling อย่างเดียวกัน.
5000/users/1
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
});
}
});
🔍 อธิบายโค้ด
INSERT INTO– คำสั่ง SQL สำหรับเพิ่มข้อมูล?– Placeholder สำหรับป้องกัน SQL injectionstatus(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"
}
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
});
}
});
🔍 อธิบายโค้ด
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"
}
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
});
}
});
🔍 อธิบายโค้ด
DELETE FROM– คำสั่ง SQL สำหรับลบข้อมูลaffectedRows– จำนวนแถวที่ถูกลบ (0 = ไม่พบข้อมูล)
🧪 ทดสอบ API
DELETE http://localhost:5000/users/1
🎉 สรุป 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