XÂY DỰNG RESTFUL API VỚI EXPRESS.JS DÀNH CHO NGƯỜI MỚI BẮT ĐẦU

Sau khi đã làm quen với Node.js và NPM, bước tiếp theo thực tế nhất là ứng dụng Node.js để xây dựng một Web Server / RESTful API. Trong hệ sinh thái Node.js, Express.js là framework phổ biến nhất, đóng vai trò tương tự như Flask hoặc FastAPI trong Python.

1. Express.js là gì?

Mặc định Node.js có sẵn module http để tạo server, nhưng code rất dài dòng và phức tạp. Express.js là một thư viện tối giản (Minimalist Framework) giúp bạn:

  • Dễ dàng định nghĩa các Routes (Đường dẫn URL như /api/users, /api/products).

  • Lắng nghe các HTTP Methods (GET, POST, PUT, DELETE).

  • Quản lý dữ liệu gửi lên (Request) và phản hồi về (Response) dưới dạng JSON.

  • Sử dụng Middleware để xử lý logic trung gian (xác thực, log, giải mã dữ liệu).

2. Các khái niệm cốt lõi trong RESTful API

Khi xây dựng API, chúng ta sử dụng các phương thức HTTP tương ứng với thao tác CRUD (Create, Read, Update, Delete):

HTTP Method Thao tác CRUD Chức năng Ví dụ URL
GET Read Lấy danh sách hoặc chi tiết dữ liệu GET /api/books
POST Create Tạo mới một tài nguyên POST /api/books
PUT Update Cập nhật toàn bộ tài nguyên PUT /api/books/1
DELETE Delete Xóa một tài nguyên DELETE /api/books/1

3. Thực hành Step-by-Step: Tạo RESTful API Quản lý Sách

Chúng ta sẽ cùng viết một ứng dụng hoàn chỉnh quản lý danh sách sách trong file server.js.

Bước 1: Khởi tạo dự án và cài đặt Express

Mở Terminal tại thư mục thực hành của bạn và chạy các lệnh sau:

Bash
# 1. Tạo thư mục bài tập mới
mkdir express-demo && cd express-demo

# 2. Khởi tạo file package.json
npm init -y

# 3. Cài đặt Express
npm install express

Cập nhật file package.json để dùng cú pháp import/export bằng cách thêm "type": "module":

{
  "name": "express-demo",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "start": "node server.js",
    "dev": "node --watch server.js"
  },
  "dependencies": {
    "express": "^4.19.2"
  }
}

(Mẹo: cờ --watch của Node.js giúp server tự động khởi động lại mỗi khi bạn Ctrl+S lưu file).

Bước 2: Viết mã nguồn Web Server (server.js)

Tạo file server.js và dán toàn bộ đoạn code dưới đây:

import express from 'express';

const app = express();
const PORT = 3000;

// 1. MIDDLEWARE: Cho phép Express đọc và giải mã dữ liệu dạng JSON gửi từ Client (Body Parser)
app.use(express.json());

// Cơ sở dữ liệu giả lập (In-memory Database)
let books = [
    { id: 1, title: 'Lập trình JavaScript Hiện Đại', author: 'Tuan' },
    { id: 2, title: 'Nhập môn Node.js & Express', author: 'Nam' }
];

// =================================================================
// 2. CÁC ROUTES (ENDPOINTS) RESTFUL API
// =================================================================

// [GET] /api/books - Lấy toàn bộ danh sách sách
app.get('/api/books', (req, res) => {
    res.status(200).json({
        success: true,
        data: books
    });
});

// [GET] /api/books/:id - Lấy thông tin 1 quyển sách theo ID (Route Parameters)
app.get('/api/books/:id', (req, res) => {
    const bookId = parseInt(req.params.id, 10);
    const book = books.find(b => b.id === bookId);

    if (!book) {
        return res.status(404).json({
            success: false,
            message: 'Không tìm thấy quyển sách này!'
        });
    }

    res.status(200).json({ success: true, data: book });
});

// [POST] /api/books - Thêm một quyển sách mới
app.post('/api/books', (req, res) => {
    const { title, author } = req.body;

    // Validate dữ liệu đầu vào cơ bản
    if (!title || !author) {
        return res.status(400).json({
            success: false,
            message: 'Vui lòng điền đầy đủ tiêu đề và tác giả!'
        });
    }

    const newBook = {
        id: books.length + 1,
        title,
        author
    };

    books.push(newBook);
    res.status(201).json({ success: true, data: newBook });
});

// [DELETE] /api/books/:id - Xóa một quyển sách
app.delete('/api/books/:id', (req, res) => {
    const bookId = parseInt(req.params.id, 10);
    const initialLength = books.length;
    
    // Lọc bỏ quyển sách có ID trùng khớp
    books = books.filter(b => b.id !== bookId);

    if (books.length === initialLength) {
        return res.status(404).json({
            success: false,
            message: 'Không tìm thấy sách để xóa!'
        });
    }

    res.status(200).json({
        success: true,
        message: `Đã xóa thành công sách có ID: ${bookId}`
    });
});

// =================================================================
// 3. KHỞI CHẠY SERVER
// =================================================================
app.listen(PORT, () => {
    console.log(`Server đang chạy tại đường dẫn: http://localhost:${PORT}`);
});

Bước 3: Chạy và Kiểm tra API

  1. Mở Terminal và khởi chạy server bằng lệnh dev script vừa tạo:

    Bash
    npm run dev
    

    Terminal sẽ hiện: Server đang chạy tại đường dẫn: http://localhost:3000

  2. Cách kiểm tra API:

    • Cách đơn giản nhất: Mở trình duyệt web và truy cập URL: http://localhost:3000/api/books để xem danh sách sách dạng JSON.

    • Cách chuyên nghiệp: Dùng phần mềm như Postman, Thunder Client (Extension trên VS Code), hoặc dùng lệnh curl trong Terminal để kiểm tra các phương thức POST, DELETE.

Ví dụ kiểm tra POST bằng cURL (trong Terminal khác):

Bash
curl -X POST http://localhost:3000/api/books \
     -H "Content-Type: application/json" \
     -d "{\"title\": \"Kinh nghiệm Actuary\", \"author\": \"Minh\"}"

4. Tóm tắt các thành phần cần nhớ trong Express

  1. app.use(express.json()): Luôn phải có dòng này ở đầu file nếu API của bạn nhận dữ liệu gửi lên qua body dạng JSON.

  2. req.params: Dùng để lấy biến động trên URL (Ví dụ: /api/books/:id ➔ req.params.id).

  3. req.body: Dùng để lấy dữ liệu gửi lên từ form hoặc JSON body trong phương thức POST/PUT.

  4. res.status().json(): Phương thức phản hồi tiêu chuẩn trả về Mã trạng thái HTTP (200, 201, 400, 404, 500) kèm chuỗi dữ liệu JSON.