Nếu bạn đang tìm hiểu về Node.js, có lẽ bạn đã nghe đến Express.js—một framework cực kỳ phổ biến trong lĩnh vực lập trình backend. Với cấu trúc đơn giản, tính linh hoạt và khả năng sử dụng dễ dàng, Express.js đã nhanh chóng trở thành sự lựa chọn hàng đầu cho những lập trình viên muốn phát triển ứng dụng web hoặc API một cách nhanh chóng và hiệu quả.
Trong bài viết này, chúng ta sẽ cùng tìm hiểu Express.js là gì, lý do tại sao nó lại yêu thích đến vậy trong cộng đồng lập trình viên, cùng những lợi ích mà framework này mang lại. Thêm vào đó, bạn sẽ thấy cách mà Express.js giúp đơn giản hóa quy trình phát triển ứng dụng Node.js.
1. Express.js Là Gì?
Express.js là một framework nhẹ được xây dựng trên nền tảng Node.js, được thiết kế với mục tiêu làm cho việc phát triển ứng dụng web và API trở nên nhanh chóng, hiệu quả và dễ bảo trì hơn. Nó cung cấp các công cụ tiện lợi để xử lý yêu cầu HTTP, quản lý định tuyến (routing) và bổ sung các tính năng khác thông qua middleware.
Với Express.js, bạn có thể xây dựng các API RESTful một cách dễ dàng và quản lý dữ liệu hiệu quả mà không phải viết quá nhiều mã phức tạp. Điều này giúp lập trình viên tập trung vào logic ứng dụng thay vì lo về các yêu cầu HTTP chi tiết.
Trong Node.js thuần, các lập trình viên phải tự viết mã để quản lý yêu cầu HTTP và xử lý dữ liệu. Một ví dụ đơn giản về việc tạo một API danh sách công việc có thể được thể hiện như sau:
const http = require('http');
let tasks = [
{ id: 1, task: 'Làm bài tập' },
{ id: 2, task: 'Dọn phòng' }
];
const server = http.createServer((req, res) => {
if (req.url === '/tasks' && req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(tasks));
} else if (req.url === '/tasks' && req.method === 'POST') {
let body = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
const newTask = JSON.parse(body);
tasks.push(newTask);
res.writeHead(201, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(newTask));
});
} else {
res.writeHead(404, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'Không tìm thấy trang' }));
}
});
server.listen(3000, () => {
console.log('Server đang chạy tại http://localhost:3000');
});
Với Express.js, mọi thứ trở nên dễ dàng hơn rất nhiều, bạn chỉ cần khai báo các route đơn giản và sử dụng middleware để xử lý dữ liệu JSON:
const express = require('express');
const app = express();
app.use(express.json()); // Middleware để xử lý JSON
let tasks = [
{ id: 1, task: 'Làm bài tập' },
{ id: 2, task: 'Dọn phòng' }
];
// Lấy danh sách công việc
app.get('/tasks', (req, res) => {
res.json(tasks);
});
// Thêm công việc mới
app.post('/tasks', (req, res) => {
const newTask = req.body;
tasks.push(newTask);
res.status(201).json(newTask);
});
// Xử lý các yêu cầu không hợp lệ
app.use((req, res) => {
res.status(404).json({ message: 'Không tìm thấy trang' });
});
// Khởi chạy server
app.listen(3000, () => {
console.log('Server đang chạy tại http://localhost:3000');
});
2. Các Tính Năng Chính Của Express.js
2.1 Templating Engines
Templating engines cho phép bạn tạo ra các mẫu HTML có chứa các placeholder (chỗ trống) để có thể thay thế bằng dữ liệu thực tế khi trang được hiển thị. Điều này giúp tạo ra các trang HTML linh hoạt và dễ dàng hơn, đặc biệt khi dữ liệu thường xuyên thay đổi.
Một số templating engines phổ biến trong Express.js bao gồm:
- EJS (Embedded JavaScript): Cho phép bạn nhúng JavaScript trực tiếp vào HTML.
- Pug: Cung cấp cú pháp ngắn gọn, dễ hiểu hơn để xây dựng HTML.
- Handlebars và Mustache: Là các engines khác thường được sử dụng để quản lý views và tạo HTML.
Ví dụ: Bạn có thể tạo một tệp EJS chứa placeholder trong thư mục views
(ví dụ: index.ejs
):
<html>
<head>
<title>Trang chào mừng</title>
</head>
<body>
<h1>Xin chào, <%= name %>!</h1>
<p>Tuổi của bạn là: <%= age %></p>
</body>
</html>
Khi người dùng truy cập vào trang chủ, dữ liệu thực tế (name
và age
) sẽ được thay thế trong mẫu này.
2.2 Phục Vụ Các Tệp Tĩnh
Middleware express.static()
giúp phục vụ các tệp tĩnh trong dự án trở nên đơn giản hơn. Bạn chỉ cần chỉ định thư mục chứa các tệp tĩnh (ví dụ như hình ảnh, CSS, JavaScript), và Express.js sẽ tự động xử lý việc cung cấp chúng cho người dùng.
const express = require('express');
const app = express();
// Sử dụng middleware để phục vụ các tệp tĩnh
app.use(express.static('public'));
app.listen(3000, () => {
console.log('Server đang chạy tại http://localhost:3000');
});
Lệnh app.use(express.static('public'))
sẽ khiến Express.js tự động cung cấp các tệp tĩnh trong thư mục public, giúp người dùng tiếp cận tài nguyên này mà không cần phải viết thêm mã phức tạp.
2.3 Định Tuyến
Routing (Định tuyến) trong Express.js là cách bạn thiết lập các quy tắc để xử lý các yêu cầu HTTP từ người dùng đến đúng nơi trong ứng dụng của bạn. Ví dụ, bạn có một website với ba trang:
- Trang chính (
/
) - Trang giới thiệu (
/about
) - Trang liên hệ (
/contact
)
Bạn sẽ tạo các route tương ứng để khi người dùng truy cập vào các địa chỉ này, ứng dụng của bạn sẽ phản hồi đúng cách.
const express = require('express');
const app = express();
// Định tuyến trang chủ
app.get('/', (req, res) => {
res.send('Chào mừng bạn đến với trang chủ!');
});
// Định tuyến trang giới thiệu
app.get('/about', (req, res) => {
res.send('Đây là trang giới thiệu về chúng tôi.');
});
// Định tuyến trang liên hệ
app.get('/contact', (req, res) => {
res.send('Trang liên hệ với chúng tôi.');
});
// Khởi động máy chủ
app.listen(3000, () => {
console.log('Server đang chạy tại http://localhost:3000');
});
2.4 Middleware
Middleware là những hàm đặc biệt trong Express.js, được thực thi khi ứng dụng của bạn nhận yêu cầu từ người dùng và trước khi gửi phản hồi cho họ. Middleware có thể thực hiện nhiều nhiệm vụ như ghi lại thông tin về yêu cầu, xác thực người dùng, xử lý dữ liệu, và trả lại lỗi nếu có vấn đề xảy ra.
const express = require('express');
const app = express();
// Middleware 1: Ghi lại URL yêu cầu
app.use((req, res, next) => {
console.log('Yêu cầu đến từ URL:', req.url);
next(); // Chuyển tiếp đến middleware tiếp theo
});
// Middleware 2: Tiếp tục xử lý yêu cầu
app.use((req, res, next) => {
console.log('Đang xử lý yêu cầu...');
next(); // Tiếp tục chuyển đến phần xử lý chính
});
// Định tuyến trang chủ
app.get('/', (req, res) => {
res.send('Chào mừng bạn đến với trang chủ!');
});
// Middleware xử lý lỗi
app.use((err, req, res, next) => {
console.error('Có lỗi xảy ra:', err.message);
res.status(500).send('Xin lỗi, đã có lỗi xảy ra!');
});
// Khởi động máy chủ
app.listen(3000, () => {
console.log('Server chạy trên cổng 3000');
});
2.5 Hỗ Trợ Xây Dựng RESTful API
Express.js hỗ trợ xây dựng API tuân thủ các nguyên tắc của kiến trúc REST (Representational State Transfer) bằng việc thiết lập các route phù hợp với từng yêu cầu.
Mô hình API quản lý danh sách sản phẩm có thể bao gồm các chức năng như xem danh sách tất cả sản phẩm, xem thông tin chi tiết sản phẩm, thêm sản phẩm mới, cập nhật thông tin sản phẩm, và xóa sản phẩm.
const express = require('express');
const app = express();
app.use(express.json()); // Middleware để xử lý dữ liệu JSON
let products = [
{ id: 1, name: 'Điện thoại', price: 500 },
{ id: 2, name: 'Laptop', price: 1000 }
];
// 1. Lấy danh sách tất cả sản phẩm (GET request)
app.get('/products', (req, res) => {
res.json(products);
});
// 2. Lấy thông tin chi tiết sản phẩm (GET request)
app.get('/products/:id', (req, res) => {
const product = products.find(p => p.id === parseInt(req.params.id));
if (!product) return res.status(404).send('Sản phẩm không tồn tại');
res.json(product);
});
// 3. Thêm một sản phẩm mới (POST request)
app.post('/products', (req, res) => {
const newProduct = {
id: products.length + 1,
name: req.body.name,
price: req.body.price
};
products.push(newProduct);
res.status(201).json(newProduct);
});
// 4. Cập nhật thông tin sản phẩm (PUT request)
app.put('/products/:id', (req, res) => {
const product = products.find(p => p.id === parseInt(req.params.id));
if (!product) return res.status(404).send('Sản phẩm không tồn tại');
product.name = req.body.name;
product.price = req.body.price;
res.json(product);
});
// 5. Xóa một sản phẩm (DELETE request)
app.delete('/products/:id', (req, res) => {
const product = products.find(p => p.id === parseInt(req.params.id));
if (!product) return res.status(404).send('Sản phẩm không tồn tại');
const index = products.indexOf(product);
products.splice(index, 1);
res.json(product);
});
// Khởi động máy chủ
app.listen(3000, () => {
console.log('Server đang chạy tại http://localhost:3000');
});
3. Kết Luận
Tóm lại, Express.js là một công cụ quan trọng giúp lập trình viên backend dễ dàng xây dựng ứng dụng web và API một cách nhanh chóng và hiệu quả. Đặc biệt, nó là một lựa chọn tuyệt vời cho những ai đang làm việc với Node.js nhờ vào sự cân bằng tuyệt vời giữa hiệu suất và tính dễ dùng.
Để tìm hiểu thêm về các khái niệm khác trong lập trình, hãy truy cập vào comdy.vn.