Routing trong Node.js

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

Routing (định tuyến) trong Node.js giúp xác định cách xử lý các yêu cầu HTTP dựa trên đường dẫn URL (/home, /about, v.v.) và phương thức HTTP (GET, POST, v.v.).

1. Tạo các route đơn giản

Dưới đây là cách tạo một server HTTP và định tuyến các đường dẫn /home/about bằng module http:

Ví dụ: Routing cơ bản

const http = require("http");

const server = http.createServer((req, res) => {
  res.writeHead(200, { "Content-Type": "text/plain; charset=UTF-8" });

  if (req.url === "/home") {
    res.end("Trang chủ");
  } else if (req.url === "/about") {
    res.end("Giới thiệu về chúng tôi");
  } else {
    res.writeHead(404, { "Content-Type": "text/plain" });
    res.end("404 - Không tìm thấy trang");
  }
});

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

Giải thích:

  • req.url chứa đường dẫn của request.
  • Nếu req.url === "/home", server trả về "Trang chủ".
  • Nếu req.url === "/about", server trả về "Giới thiệu về chúng tôi".
  • Nếu không có route nào khớp, server trả về 404 - Không tìm thấy trang.

Mở trình duyệt và truy cập http://localhost:3000/home hoặc http://localhost:3000/about để kiểm tra.

2. Xử lý request body và query string

2.1. Xử lý Query String

Query string là phần tham số sau dấu ? trên URL, ví dụ:

http://localhost:3000/search?keyword=nodejs

Dưới đây là cách đọc query string trong Node.js:

const http = require("http");
const url = require("url");

const server = http.createServer((req, res) => {
  const parsedUrl = url.parse(req.url, true);
  res.writeHead(200, { "Content-Type": "text/plain; charset=UTF-8" });

  if (parsedUrl.pathname === "/search") {
    const keyword = parsedUrl.query.keyword;
    res.end(`Kết quả tìm kiếm cho: ${keyword}`);
  } else {
    res.writeHead(404, { "Content-Type": "text/plain" });
    res.end("404 - Không tìm thấy trang");
  }
});

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

Giải thích:

  • url.parse(req.url, true) giúp tách URL thành pathnamequery.
  • parsedUrl.query.keyword lấy giá trị tham số keyword.
  • Nếu truy cập http://localhost:3000/search?keyword=nodejs, server sẽ phản hồi:
    Kết quả tìm kiếm cho: nodejs
    

2.2. Xử lý Request Body (POST Request)

Khi client gửi dữ liệu qua phương thức POST, dữ liệu không nằm trong URL mà được gửi trong body của request.

const http = require("http");

const server = http.createServer((req, res) => {
  if (req.method === "POST" && req.url === "/submit") {
    let body = "";

    req.on("data", (chunk) => {
      body += chunk.toString(); // Chuyển dữ liệu thành chuỗi
    });

    req.on("end", () => {
      res.writeHead(200, { "Content-Type": "text/plain; charset=UTF-8" });
      res.end(`Dữ liệu nhận được: ${body}`);
    });
  } else {
    res.writeHead(404, { "Content-Type": "text/plain" });
    res.end("404 - Không tìm thấy trang");
  }
});

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

Giải thích:

  1. Kiểm tra req.method === "POST" để chỉ xử lý khi nhận yêu cầu POST.
  2. Sử dụng req.on("data") để đọc dữ liệu từ request body.
  3. Sử dụng req.on("end") để xử lý sau khi dữ liệu đã được nhận đầy đủ.
  4. Server phản hồi lại dữ liệu nhận được.

Gửi request từ client bằng curl:

curl -X POST -d "name=John&age=25" http://localhost:3000/submit

Kết quả server trả về:

Dữ liệu nhận được: name=John&age=25

3. Tạo Routing nâng cao với Express

Sử dụng http để xử lý routing thủ công có thể phức tạp. Thay vào đó, bạn có thể dùng Express.js để tạo route một cách đơn giản hơn.

Cài đặt Express

npm install express

Tạo server với Express

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

// Middleware để parse body của request
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

// Route GET /home
app.get("/home", (req, res) => {
  res.send("Trang chủ");
});

// Route GET với query string
app.get("/search", (req, res) => {
  const keyword = req.query.keyword;
  res.send(`Kết quả tìm kiếm cho: ${keyword}`);
});

// Route POST /submit
app.post("/submit", (req, res) => {
  res.send(`Dữ liệu nhận được: ${JSON.stringify(req.body)}`);
});

// Khởi động server
app.listen(3000, () => {
  console.log("Server đang chạy tại http://localhost:3000");
});

Giải thích:

  • app.get("/home", callback): Định nghĩa route /home.
  • req.query: Lấy query string từ URL.
  • app.post("/submit", callback): Xử lý request POST và lấy dữ liệu từ req.body.
  • express.json() giúp parse dữ liệu JSON trong body request.

Test bằng curl:

curl -X POST -H "Content-Type: application/json" -d '{"name":"John","age":25}' http://localhost:3000/submit

Server trả về:

{"name":"John","age":25}

4. Kết luận

Tính năng Node.js (http module) Express.js
Tạo route cơ bản Phải xử lý req.urlreq.method thủ công Sử dụng app.get()app.post() đơn giản
Xử lý query string Dùng url.parse() để lấy tham số Dùng req.query trực tiếp
Xử lý request body Phải lắng nghe req.on("data") Dùng express.json() để parse body tự động
Cấu hình dễ dàng Cần viết nhiều code hơn Ngắn gọn, dễ sử dụng

Nếu bạn cần một ứng dụng nhỏ, có thể sử dụng http module. Nhưng nếu bạn muốn phát triển API hoặc web phức tạp, Express.js là một lựa chọn tối ưu hơn.

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ệ