Routing nâng cao trong Express.js

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 31 tháng 1, 2025

1. Giới thiệu về Routing nâng cao

Express.js cung cấp khả năng tạo các route cho ứng dụng web với cú pháp rất dễ sử dụng. Bài viết này sẽ giới thiệu cách sử dụng các tham số trong URL (req.params), truy vấn (req.query), và dữ liệu gửi từ client (req.body). Đồng thời, chúng ta sẽ tìm hiểu về middleware trong Express để xử lý các yêu cầu một cách linh hoạt.

2. Sử dụng req.params, req.query, req.body

a. req.params

req.params chứa các tham số được truyền trong URL. Tham số này thường được sử dụng khi định nghĩa route động, chẳng hạn như ID của một bài viết, người dùng, v.v.

Ví dụ:

const express = require('express');
const app = express();

// Route với tham số động
app.get('/user/:id', (req, res) => {
  const userId = req.params.id; // Lấy tham số 'id' từ URL
  res.send(`Thông tin người dùng có ID: ${userId}`);
});

// Chạy server
app.listen(3000, () => {
  console.log('Server đang chạy tại http://localhost:3000');
});

Khi truy cập http://localhost:3000/user/123, bạn sẽ nhận được phản hồi:

Thông tin người dùng có ID: 123

b. req.query

req.query chứa các tham số truy vấn (query parameters) trong URL. Tham số này thường được sử dụng trong các tìm kiếm hoặc lọc dữ liệu.

Ví dụ:

const express = require('express');
const app = express();

// Route với query string
app.get('/search', (req, res) => {
  const keyword = req.query.keyword; // Lấy tham số 'keyword' từ query string
  res.send(`Tìm kiếm với từ khóa: ${keyword}`);
});

// Chạy server
app.listen(3000, () => {
  console.log('Server đang chạy tại http://localhost:3000');
});

Khi truy cập http://localhost:3000/search?keyword=nodejs, bạn sẽ nhận được phản hồi:

Tìm kiếm với từ khóa: nodejs

c. req.body

req.body chứa dữ liệu được gửi từ client trong các yêu cầu POST, PUT, PATCH. Để sử dụng req.body, bạn cần cài đặt middleware để phân tích dữ liệu trong request.

Cài đặt middleware để xử lý dữ liệu POST (body-parser)

Đầu tiên, bạn cần cài đặt express.json() hoặc express.urlencoded() để xử lý các yêu cầu chứa body.

npm install express

Ví dụ:

const express = require('express');
const app = express();

// Middleware để phân tích dữ liệu JSON trong request body
app.use(express.json());

// Route nhận POST request
app.post('/user', (req, res) => {
  const userData = req.body; // Lấy dữ liệu từ body
  res.send(`Thông tin người dùng đã nhận: ${JSON.stringify(userData)}`);
});

// Chạy server
app.listen(3000, () => {
  console.log('Server đang chạy tại http://localhost:3000');
});

Khi gửi một yêu cầu POST tới http://localhost:3000/user với body:

{
  "name": "Nguyễn Văn A",
  "age": 30
}

Bạn sẽ nhận được phản hồi:

Thông tin người dùng đã nhận: {"name":"Nguyễn Văn A","age":30}

3. Middleware trong Express.js

a. Middleware là gì?

Middleware trong Express là các hàm xử lý được chạy trong quá trình tiếp nhận và xử lý request, trước khi gửi response về client. Middleware có thể được sử dụng để:

  • Kiểm tra quyền truy cập.
  • Phân tích request body.
  • Log thông tin.
  • Xử lý lỗi.

Middleware có thể được áp dụng toàn cục (cho tất cả các route) hoặc cụ thể cho từng route.

b. Cách sử dụng middleware

Express cung cấp một số cách để sử dụng middleware: toàn cục, theo route, hoặc theo nhóm route.

i. Middleware toàn cục

Middleware toàn cục sẽ được áp dụng cho tất cả các route.

const express = require('express');
const app = express();

// Middleware toàn cục
app.use((req, res, next) => {
  console.log(`Yêu cầu đến: ${req.method} ${req.url}`);
  next(); // Tiếp tục xử lý request
});

// Route mẫu
app.get('/', (req, res) => {
  res.send('Trang chủ');
});

// Chạy server
app.listen(3000, () => {
  console.log('Server đang chạy tại http://localhost:3000');
});

Mỗi khi có yêu cầu đến server, middleware này sẽ log thông tin request.

ii. Middleware theo route

Middleware cũng có thể được áp dụng riêng cho từng route.

const express = require('express');
const app = express();

// Middleware chỉ áp dụng cho route '/user'
app.use('/user', (req, res, next) => {
  console.log('Đang xử lý route /user');
  next();
});

// Route '/user'
app.get('/user', (req, res) => {
  res.send('Trang người dùng');
});

// Chạy server
app.listen(3000, () => {
  console.log('Server đang chạy tại http://localhost:3000');
});

Khi truy cập http://localhost:3000/user, bạn sẽ thấy log:

Đang xử lý route /user

iii. Middleware xử lý lỗi

Middleware có thể xử lý lỗi khi xảy ra vấn đề trong quá trình xử lý request.

const express = require('express');
const app = express();

// Route mẫu có lỗi
app.get('/', (req, res) => {
  throw new Error('Đã xảy ra lỗi!');
});

// Middleware xử lý lỗi
app.use((err, req, res, next) => {
  console.error(err);
  res.status(500).send('Đã xảy ra lỗi! Vui lòng thử lại sau.');
});

// Chạy server
app.listen(3000, () => {
  console.log('Server đang chạy tại http://localhost:3000');
});

Khi truy cập http://localhost:3000/, bạn sẽ nhận được phản hồi lỗi:

Đã xảy ra lỗi! Vui lòng thử lại sau.

4. Tổng kết

Khái niệm Giải thích
req.params Lấy các tham số từ URL, ví dụ: /user/:id
req.query Lấy các tham số từ query string trong URL, ví dụ: /search?keyword=nodejs
req.body Lấy dữ liệu từ request body khi gửi yêu cầu POST, PUT
Middleware Là các hàm xử lý yêu cầu trước khi gửi response, có thể xử lý xác thực, log, hoặc lỗi

Với Express.js, việc xử lý routing, tham số trong URL, và middleware trở nên đơn giản và dễ dàng. Bạn có thể linh hoạt kiểm soát và xử lý các yêu cầu đến ứng dụng của mình một cách hiệu quả.

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ