Giới thiệu
Trong thế giới phát triển phần mềm hiện đại, RESTful API đã trở thành tiêu chuẩn để xây dựng các giao diện kết nối giữa client và server. Kết hợp với MySQL - một trong những hệ quản trị cơ sở dữ liệu quan hệ phổ biến nhất, và Node.js - runtime JavaScript bên server, chúng ta có một bộ công cụ mạnh mẽ để phát triển các ứng dụng web hiệu quả. Bài viết này sẽ hướng dẫn chi tiết cách lập trình RESTful API sử dụng MySQL và Node.js, từ thiết lập môi trường đến triển khai các phương thức cơ bản.
Chuẩn bị môi trường
Để bắt đầu, bạn cần cài đặt Node.js trên máy. Sau đó, tạo một thư mục cho dự án và khởi tạo project với npm:
mkdir restful-api-mysql
cd restful-api-mysql
npm init -y
Tiếp theo, cài đặt các package cần thiết:
npm install express mysql2 dotenv
Trong đó: - express: framework web cho Node.js. - mysql2: driver kết nối MySQL. - dotenv: quản lý biến môi trường.
Thiết lập kết nối MySQL
Tạo file .env để lưu trữ thông tin kết nối database:
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=yourpassword
DB_NAME=mydatabase
Tạo file config/database.js:
const mysql = require('mysql2');
require('dotenv').config();
const pool = mysql.createPool({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
module.exports = pool.promise();
Xây dựng model và controller
Giả sử chúng ta xây dựng API cho một bảng users với các trường: id, name, email, created_at.
Tạo file models/User.js:
const db = require('../config/database');
class User {
static async findAll() {
const [rows] = await db.query('SELECT * FROM users');
return rows;
}
static async findById(id) {
const [rows] = await db.query('SELECT * FROM users WHERE id = ?', [id]);
return rows[0];
}
static async create(userData) {
const [result] = await db.query(
'INSERT INTO users (name, email) VALUES (?, ?)',
[userData.name, userData.email]
);
return result.insertId;
}
static async update(id, userData) {
await db.query(
'UPDATE users SET name = ?, email = ? WHERE id = ?',
[userData.name, userData.email, id]
);
}
static async delete(id) {
await db.query('DELETE FROM users WHERE id = ?', [id]);
}
}
module.exports = User;
Tạo file controllers/UserController.js:
const User = require('../models/User');
exports.getAllUsers = async (req, res) => {
try {
const users = await User.findAll();
res.json(users);
} catch (err) {
res.status(500).json({ error: err.message });
}
};
Quảng cáo
300x250 In-Content Advertisement
exports.getUserById = async (req, res) => {
try {
const user = await User.findById(req.params.id);
if (!user) return res.status(404).json({ error: 'User not found' });
res.json(user);
} catch (err) {
res.status(500).json({ error: err.message });
}
};
exports.createUser = async (req, res) => {
try {
const userId = await User.create(req.body);
res.status(201).json({ id: userId, message: 'User created successfully' });
} catch (err) {
res.status(500).json({ error: err.message });
}
};
exports.updateUser = async (req, res) => {
try {
await User.update(req.params.id, req.body);
res.json({ message: 'User updated successfully' });
} catch (err) {
res.status(500).json({ error: err.message });
}
};
exports.deleteUser = async (req, res) => {
try {
await User.delete(req.params.id);
res.json({ message: 'User deleted successfully' });
} catch (err) {
res.status(500).json({ error: err.message });
}
};
Tạo router và ứng dụng chính
Tạo file routes/users.js:
const express = require('express');
const router = express.Router();
const userController = require('../controllers/UserController');
router.get('/', userController.getAllUsers);
router.get('/:id', userController.getUserById);
router.post('/', userController.createUser);
router.put('/:id', userController.updateUser);
router.delete('/:id', userController.deleteUser);
module.exports = router;
Tạo file app.js:
const express = require('express');
const userRoutes = require('./routes/users');
const app = express();
app.use(express.json());
app.use('/api/users', userRoutes);
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(Server is running on port ${PORT});
});
Kiểm thử API
Sử dụng Postman hoặc curl để kiểm thử:
# Lấy tất cả users
curl http://localhost:3000/api/users
# Tạo user mới
curl -X POST http://localhost:3000/api/users
-H "Content-Type: application/json"
-d '{"name":"John Doe","email":"[email protected]"}'
# Lấy user theo ID
curl http://localhost:3000/api/users/1
# Cập nhật user
curl -X PUT http://localhost:3000/api/users/1
-H "Content-Type: application/json"
-d '{"name":"Jane Doe","email":"[email protected]"}'
# Xóa user
curl -X DELETE http://localhost:3000/api/users/1
Kết luận
Qua bài viết này, chúng ta đã xây dựng một RESTful API hoàn chỉnh với MySQL và Node.js, bao gồm kết nối database, model, controller, router và ứng dụng chính. Điều quan trọng là tổ chức code một cách rõ ràng, tách biệt các layer và xử lý lỗi một cách hiệu quả. Bạn có thể mở rộng dự án bằng cách thêm xác thực, validation, pagination, hoặc kết nối với các database khác. Chúc bạn thành công với dự án của mình!