Express.js là gì? Những tính năng chính của Express.js

Đã kiểm duyệt nội dung
Đánh giá
Express.js là một framework web phía backend chạy trên nền tảng Node.js, giúp bạn xây dựng ứng dụng web và API một cách nhanh chóng, linh hoạt và dễ mở rộng. Trong bài viết này, bằng kinh nghiệm thực tế trong việc tối ưu hóa hiệu suất ứng dụng Node.js cho khách hàng tại Vietnix mình sẽ giúp bạn ìm hiểu tổng quan về Express.js từ khái niệm, cấu trúc cho đến các tính năng quan trọng để bạn có thể tự tin áp dụng vào dự án thực tế.
Những điểm chính
- Quan điểm của mình: Sự phổ biến của Express.js không đến từ việc cung cấp quá nhiều tính năng, mà nằm ở triết lý tối giản và hệ sinh thái Middleware cực kỳ mạnh mẽ. Điều này giúp lập trình viên hoàn toàn kiểm soát cấu trúc dự án. Tuy nhiên, để phát huy tối đa sức mạnh của Express, bạn cần một hạ tầng ổn định để xử lý tốt các luồng I/O không đồng bộ đặc trưng của Node.js.
- Khái niệm và vai trò: Hiểu rõ Express.js là một framework web backend cho Node.js, giúp bạn xây dựng ứng dụng và API một cách nhanh chóng, linh hoạt và dễ mở rộng.
- Các đặc tính nổi bật: Nắm được các đặc tính nổi bật như hiệu năng cao và tối giản, cấu trúc linh hoạt, middleware, routing và khả năng mở rộng/tích hợp cao, giúp bạn hiểu rõ thế mạnh của Express.js.
- Các tính năng chính: Nắm được các tính năng cốt lõi như Templating Engines, phục vụ tệp tĩnh, định tuyến và Middleware, giúp bạn hiểu rõ các công cụ mà Express.js cung cấp để xây dựng ứng dụng web.
- Cấu trúc dự án: Biết được cấu trúc thư mục và các file chính trong một dự án Express.js, giúp bạn tổ chức mã nguồn một cách rõ ràng và dễ bảo trì.
- Hướng dẫn sử dụng: Nắm vững quy trình từng bước từ khởi tạo, cấu hình middleware, định nghĩa routes đến khởi động server, giúp bạn tự tin xây dựng và chạy ứng dụng Express.js đầu tiên của mình.
- Biết thêm Vietnix: Tìm hiểu về giải pháp VPS, máy chủ, Enterprise Cloud của Vietnix, giúp có thêm lựa chọn hạ tầng cho các hệ thống ERP, CRM và Ecommerce.
- Câu hỏi thường gặp: Được giải đáp các thắc mắc về GitHub, plugin, tích hợp với PostgreSQL và TypeScript, giúp củng cố kiến thức và làm rõ các vấn đề thực tế.

Express.js là gì?
Express.js (thường gọi tắt là Express) là framework ứng dụng web cho Node.js, được thiết kế chuyên để xây dựng web app và API. Express có kiến trúc nhỏ gọn nhưng linh hoạt, không áp đặt cấu trúc, cho phép bạn tự tổ chức code theo nhu cầu dự án. Framework này tập trung xử lý HTTP (request/response), định tuyến URL, quản lý middleware, nên bạn không phải thao tác trực tiếp với các API thuần của Node.js.

Việc xây dựng các API hiệu năng cao với Express.js đòi hỏi tốc độ phản hồi cực nhanh và khả năng truy xuất dữ liệu không độ trễ. VPS NVMe tại Vietnix với công nghệ ổ cứng thế hệ mới, mang lại tốc độ đọc ghi vượt trội so với SSD truyền thống, giúp ứng dụng Node.js của bạn vận hành mượt mà, xử lý hàng nghìn request đồng thời mà vẫn đảm bảo tính ổn định tối đa.
Các đặc tính nổi bật của Express.js
- Hiệu năng cao và tối giản: Với lõi (core) được thiết kế tinh gọn, Express.js đảm bảo hiệu suất vượt trội và tối ưu hóa việc sử dụng tài nguyên hệ thống.
- Cấu trúc linh hoạt: Framework này không áp đặt một kiến trúc hay cấu trúc thư mục cứng nhắc, trao cho lập trình viên toàn quyền tự do trong việc tổ chức mã nguồn theo nhu cầu của dự án.
- Middleware: Cung cấp một cơ chế mạnh mẽ cho phép các hàm trung gian (middleware) can thiệp vào chu trình xử lý yêu cầu (request) và phản hồi (response). Điều này giúp việc triển khai các tác vụ như xác thực, ghi log (logging) và quản lý lỗi trở nên module hóa và hiệu quả.
- Routing: Express.js sở hữu một hệ thống định tuyến (routing) rõ ràng và mạnh mẽ, giúp lập trình viên dễ dàng ánh xạ các URL và phương thức HTTP tới các hàm xử lý tương ứng.
- Khả năng mở rộng và tích hợp cao: Express.js dễ dàng kết hợp với vô số thư viện và công cụ khác trong hệ sinh thái Node.js, từ cơ sở dữ liệu (như MongoDB) đến các giải pháp xác thực (như Passport.js) hay giao tiếp thời gian thực (như Socket.io).

Những tính năng chính của Express.js
Templating Engines
Templating engine cho phép bạn xây dựng các mẫu giao diện (template) với những placeholder, tức là các vị trí chờ dữ liệu và khi render, các vị trí này sẽ được thay thế bằng giá trị thực tế để tạo ra trang HTML hoàn chỉnh, động và linh hoạt. Cách làm này đặc biệt hữu ích trong các ứng dụng có dữ liệu thay đổi thường xuyên, giúp tránh việc lặp lại nhiều đoạn HTML giống nhau.
Một số templating engine thường được dùng cùng Express.js là:
- EJS (Embedded JavaScript): Hỗ trợ chèn trực tiếp JavaScript vào trong file HTML.
- Pug: Cung cấp cú pháp ngắn gọn hơn HTML, dễ đọc và dễ viết cấu trúc giao diện.
- Handlebars và Mustache: Hai engine phổ biến để quản lý view, tách riêng phần giao diện và dữ liệu khi sinh HTML.
Ví dụ, bạn có thể tạo một file EJS trong thư mục views (chẳng hạn index.ejs) với các placeholder cho tên và tuổi của người dùng:
<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>Sau đó, trong mã Express, bạn render template kèm dữ liệu khi người dùng truy cập trang:
app.get('/', (req, res) => {
// Truyền dữ liệu cho template
res.render('index', { name: 'John', age: 25 });
});
app.listen(3000, () => {
console.log('Server đang chạy tại http://localhost:3000');
});Khi client gửi yêu cầu đến trang chủ, Express sẽ kết hợp template với dữ liệu name và age, rồi trả về HTML đã được điền đầy đủ thông tin cho trình duyệt.
Phục vụ các tệp tĩnh
Middleware express.static() giúp bạn phục vụ các tài nguyên tĩnh trong ứng dụng một cách rất đơn giản: chỉ cần khai báo thư mục chứa file tĩnh (hình ảnh, CSS, JavaScript, font,…), Express sẽ tự động map và trả về các file đó khi có yêu cầu tương ứng.
Tệp tĩnh (static file) là những file không cần xử lý thêm ở phía server trước khi gửi đi, ví dụ: ảnh, stylesheet CSS để định dạng giao diện hoặc file JavaScript chạy trên trình duyệt. Ví dụ cấu hình phục vụ tài nguyên tĩnh từ thư mục public:
const express = require('express');
const app = express();
// Đăng ký middleware phục vụ file tĩnh trong thư mục 'public'
app.use(express.static('public'));
app.listen(3000, () => {
console.log('Server đang chạy tại http://localhost:3000');
});Dòng app.use(express.static(‘public’)) cho phép toàn bộ file bên trong thư mục public được truy cập trực tiếp qua URL mà không cần bạn viết route riêng cho từng file, giúp mã nguồn gọn và dễ quản lý hơn.
Định tuyến (Routing)
Routing trong Express.js là cơ chế ánh xạ các URL và phương thức HTTP (GET, POST, PUT, DELETE, …) tới các hàm xử lý tương ứng trong ứng dụng của bạn. Nhờ hệ thống router, mỗi đường dẫn sẽ có một handler riêng, giúp bạn tổ chức logic rõ ràng cho từng trang hoặc API endpoint.
Giả sử bạn xây dựng một website đơn giản với ba trang:
- Trang chủ (/)
- Trang giới thiệu (/about)
- Trang liên hệ (/contact)
Bạn có thể tạo các route như sau:
const express = require('express');
const app = express();
// Route cho trang chủ
app.get('/', (req, res) => {
res.send('Chào mừng bạn đến với trang chủ!');
});
// Route cho trang giới thiệu
app.get('/about', (req, res) => {
res.send('Đây là trang giới thiệu về chúng tôi.');
});
// Route cho trang liên hệ
app.get('/contact', (req, res) => {
res.send('Trang liên hệ với chúng tôi.');
});
// Khởi động server
app.listen(3000, () => {
console.log('Server đang chạy tại http://localhost:3000');
});Mỗi khi người dùng truy cập đúng đường dẫn, Express sẽ gọi hàm xử lý tương ứng và trả về nội dung thích hợp cho client.
Middleware
Middleware trong Express.js là các hàm được gọi lần lượt khi request đi vào ứng dụng và trước khi response được gửi trở lại cho client. Chúng có thể thực hiện nhiều tác vụ như ghi log, xác thực, xử lý dữ liệu đầu vào, hoặc bắt và trả về lỗi.
Mỗi request sẽ thực hiện chuỗi middleware theo thứ tự bạn cấu hình trong mã nguồn; mỗi middleware có thể:
- Gọi next() để chuyển tiếp xử lý sang middleware tiếp theo.
- Kết thúc vòng đời request bằng cách gửi response ngay lập tức cho client.
Ví dụ minh họa luồng middleware trong một app Express:
const express = require('express');
const app = express();
// Middleware 1: Log lại URL của request
app.use((req, res, next) => {
console.log('Yêu cầu đến từ URL:', req.url);
next(); // Chuyển sang middleware kế tiếp
});
// Middleware 2: Thực hiện xử lý bổ sung
app.use((req, res, next) => {
console.log('Đang xử lý yêu cầu...');
next(); // Tiếp tục tới handler chính
});
// Route 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, đã xảy ra lỗi trên hệ thống!');
});
// Khởi động server
app.listen(3000, () => {
console.log('Server chạy trên cổng 3000');
});Nhờ middleware, bạn dễ dàng tái sử dụng các bước xử lý chung cho nhiều route mà không phải lặp lại cùng một đoạn mã.
Hỗ trợ xây dựng RESTful API
Express.js rất phù hợp để xây dựng các API theo phong cách REST, nơi mỗi tài nguyên được thao tác thông qua các HTTP method như GET, POST, PUT, DELETE,… Bạn có thể định nghĩa các route tương ứng với các hành động CRUD (Create, Read, Update, Delete) trên dữ liệu.
Ví dụ với một API quản lý danh sách sản phẩm, ta hỗ trợ các chức năng: xem toàn bộ sản phẩm, xem chi tiết một sản phẩm, thêm mới, cập nhật và xóa:
const express = require('express');
const app = express();
app.use(express.json()); // Middleware parse JSON body
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)
app.get('/products', (req, res) => {
res.json(products);
});
// 2. Lấy chi tiết một sản phẩm (GET)
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 sản phẩm mới (POST)
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)
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 sản phẩm (DELETE)
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 server
app.listen(3000, () => {
console.log('Server đang chạy tại http://localhost:3000');
});Cấu trúc trên giúp API tuân thủ nguyên tắc REST, mỗi endpoint có một nhiệm vụ rõ ràng, dễ mở rộng và dễ tích hợp với frontend hoặc dịch vụ khác.
Cấu trúc Express.js
Để bạn hình dung rõ hơn về cách tổ chức một dự án Express.js, hãy xem cấu trúc minh họa mà mình đã chuẩn bị. Khi quan sát sơ đồ này, bạn sẽ thấy cấu trúc của một ứng dụng Express.js khá gọn gàng và dễ nắm bắt. Ở cấp độ gốc của dự án có các thành phần chính sau:
- File app.js: Đây là điểm khởi đầu của ứng dụng, nơi cấu hình Express, khai báo middleware, khởi tạo kết nối cần thiết và thiết lập các thiết lập chung để ứng dụng có thể chạy ổn định.
- File package.json: Chứa thông tin mô tả dự án và danh sách dependency. Nếu bạn đã quen với PHP hoặc Ruby on Rails thì có thể xem nó tương tự như composer.json hoặc Gemfile.
- Thư mục routes: Nơi bạn định nghĩa và tổ chức toàn bộ các tuyến đường (route) của ứng dụng, mỗi file có thể phụ trách một nhóm URL riêng.
- Thư mục views: Chứa các file view hoặc template dùng để render giao diện trả về cho người dùng.
- Thư mục public: Lưu trữ các tài nguyên tĩnh như file CSS, JavaScript phía client và hình ảnh của ứng dụng.
Khi đã nắm được các thành phần cốt lõi này trong một project Express, chúng ta có thể tiếp tục đi vào khái niệm Router trong Express để hiểu rõ hơn cách ứng dụng xử lý từng đường dẫn cụ thể.

Cách sử dụng Express.js
Bước 1: Khởi tạo Express (require statements)
Trước hết, bạn cần cài đặt Express bằng npm và nạp module vào project bằng require, tương tự như cách bạn làm với các package NPM khác:
const express = require('express');
const app = express();Dòng const app = express(); tạo ra một ứng dụng Express mới và gán vào biến app, từ đó bạn dùng app để cấu hình middleware, định nghĩa route và khởi động server.

Bước 2: Cấu hình middleware
Middleware là các hàm chạy trước khi request đi vào handler cuối cùng, cho phép bạn kiểm tra, xử lý hoặc chỉnh sửa request/response. Bạn có thể dùng middleware để kiểm tra quyền truy cập, validate dữ liệu, parse body, ghi log,…
Ví dụ với app.use() để đăng ký một middleware đơn giản:
app.use((req, res, next) => {
console.log('Request:', req.method, req.url);
next(); // cho phép request đi tiếp đến middleware/route tiếp theo
});Nếu middleware không gọi next() hoặc không kết thúc response, request sẽ bị treo và client không nhận được phản hồi.

Bước 3: Định nghĩa routes (routing)
Routes là nơi bạn quy định ứng dụng sẽ làm gì khi nhận một request với method và path cụ thể, ví dụ GET /, GET /users, POST /login,…
app.get('/table/:amount', (req, res) => {
const partySize = req.params.amount;
res.send(`Đang tìm bàn cho bữa tiệc ${partySize} người`);
});

Trong ví dụ trên:
- /table/:amount là route, trong đó amount là tham số động lấy từ URL.
- Bạn đọc req.params.amount để lấy số lượng và trả về response phù hợp.
Toàn bộ hàm callback trong app.get() cũng được xem là một loại middleware, vì nó nhận req, res và có thể thay đổi response gửi cho client. Khi ứng dụng lớn hơn, bạn không nên khai báo tất cả routes trực tiếp trên app. Thay vào đó, Express cung cấp express.Router() để gom nhóm các routes có liên quan lại với nhau:
const express = require('express');
const seatingRouter = express.Router();
// middleware chỉ áp dụng cho các route trong seatingRouter
seatingRouter.use((req, res, next) => {
console.log('Middleware cho nhóm route seating');
next();
});
// route cho ghế ở quầy bar
seatingRouter.get('/bar', (req, res) => {
res.send('Sắp xếp chỗ ngồi ở quầy bar');
});
// mount router vào app
app.use('/seating', seatingRouter);Khi đó, client truy cập /seating/bar sẽ đi qua middleware trong seatingRouter rồi mới đến route /bar của router này.


Bước 4: Mở cổng để ứng dụng chạy (ports)
Cuối cùng, bạn cần cho server biết sẽ lắng nghe ở port nào bằng app.listen():
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server đang chạy tại http://localhost:${PORT}`);
});

Ở ví dụ trên, ứng dụng chạy trên port 3000 của máy local. Khi bạn gõ http://localhost:3000 vào trình duyệt trong lúc server đang chạy, Express sẽ nhận request và xử lý bằng các middleware, routes mà bạn đã cấu hình.
Giải pháp Enterprise Cloud Vietnix cho hệ thống ERP, CRM, Ecommerce
Với hơn 12 năm kinh nghiệm trong ngành hạ tầng số, Vietnix khẳng định vị thế là nhà cung cấp dịch vụ máy chủ và Cloud uy tín hàng đầu tại Việt Nam. Vietnix sở hữu hạ tầng công nghệ hiện đại, đội ngũ kỹ thuật chuyên sâu sẵn sàng hỗ trợ, đảm bảo mọi dự án từ website thương mại điện tử đến các hệ thống quản trị phức tạp đều vận hành bền bỉ.
Bên cạnh các dòng VPS tốc độ cao và hệ thống máy chủ vật lý mạnh mẽ, giải pháp Enterprise Cloud của Vietnix là minh chứng cho nỗ lực tối ưu hạ tầng doanh nghiệp. Với cụm tài nguyên riêng biệt từ CPU AMD EPYC và ổ cứng NVMe Enterprise, đây là nền tảng tin cậy giúp doanh nghiệp an tâm mở rộng kinh doanh, bảo mật dữ liệu và duy trì sự ổn định tuyệt đối cho các hệ thống ERP, CRM trọng yếu.
Đừng để rào cản công nghệ làm chậm bước tiến kinh doanh của bạn. Hãy trải nghiệm sự khác biệt từ hệ thống máy chủ hiệu năng cao, ổn định và bảo mật tuyệt đối tại Vietnix.
Thông tin liên hệ:
- Website: https://vietnix.vn/
- Hotline: 1800 1093
- Email: sales@vietnix.com.vn
- Địa chỉ: 265 Hồng Lạc, Phường Bảy Hiền, Thành Phố Hồ Chí Minh
Câu hỏi thường gặp
Expressjs có GitHub không?
Expressjs là dự án mã nguồn mở, được phát triển và quản lý trên GitHub dưới repo expressjs/express. Tại đây bạn có thể xem mã nguồn, issues, pull request và lịch sử release của các phiên bản Express.
Expressjs plugin là gì?
Trong hệ sinh thái Express, plugin thường được hiểu là các middleware hoặc package bên thứ ba được cài thêm để mở rộng tính năng cho ứng dụng, ví dụ như cookie-parser, cors, morgan. Bạn chỉ cần cài đặt bằng NPM rồi require và đăng ký qua app.use() hoặc router tương ứng.
Expressjs có dùng với PostgreSQL được không?
Có. Bạn có thể dùng Expressjs kết hợp PostgreSQL thông qua các thư viện như pg để kết nối, truy vấn và thao tác dữ liệu trong database. Cách làm phổ biến là tách cấu hình kết nối, module db và gọi db.query() trong các route hoặc service.
Expressjs dùng với TypeScript như thế nào?
Bạn có thể xây dựng ứng dụng Expressjs bằng TypeScript bằng cách cài typescript, tạo tsconfig.json, dùng file .ts làm entry (ví dụ index.ts) và cài thêm @types/express để có đầy đủ type definitions. Thường sẽ dùng script build hoặc ts-node để biên dịch và chạy server TypeScript một cách thuận tiện.
ExpressJS là frontend hay backend?
Express.js là một framework backend (phía máy chủ). Nó chạy trên server để xử lý logic nghiệp vụ, giao tiếp với cơ sở dữ liệu và gửi dữ liệu về cho phía frontend (thường là trình duyệt web hoặc ứng dụng di động).
Express.js là lựa chọn phù hợp cho cả người mới bắt đầu lẫn đội ngũ kỹ thuật giàu kinh nghiệm khi muốn xây dựng ứng dụng web và API nhanh, gọn và dễ mở rộng trên nền tảng Node.js. Với hệ sinh thái middleware phong phú, cơ chế routing linh hoạt và cộng đồng lớn, Express.js giúp bạn triển khai từ các RESTful API đơn giản cho đến hệ thống doanh nghiệp phức tạp mà vẫn giữ được mã nguồn rõ ràng, dễ bảo trì về lâu dài.
THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM
Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày















