Querystring Node.js: Giải mã URL, data vibes cho Gen Z!
Nodejs

Querystring Node.js: Giải mã URL, data vibes cho Gen Z!

Author

Admin System

@root

Ngày xuất bản

19 Mar, 2026

Lượt xem

1 Lượt

"querystring module"

Chào các "dev-er" tương lai, Creyt đây! Hôm nay, chúng ta sẽ "mổ xẻ" một "bí mật" nho nhỏ nhưng cực kỳ quyền năng trong thế giới Node.js: module querystring. Nghe tên có vẻ "học thuật" nhưng tin tôi đi, nó "dễ nhằn" hơn bạn tưởng, và sẽ là "trợ thủ đắc lực" cho những ai muốn "làm chủ" dữ liệu trên URL.

1. querystring là gì mà "hot" vậy?

Bạn có bao giờ để ý khi lướt Shopee, Lazada hay Google, sau cái địa chỉ www.example.com nó hay có dấu ? rồi một lô xích xông các key=value&key2=value2 không? Đó chính là querystring – hay còn gọi là chuỗi truy vấn. Nó giống như những tờ "giấy note" nhỏ xinh, đính kèm vào gói hàng (URL) để gửi thông điệp cho người nhận (server) biết "tôi muốn gì" hoặc "tôi đang tìm kiếm cái gì".

Module querystring trong Node.js chính là "thám tử" chuyên nghiệp, giúp chúng ta:

  • Giải mã (Parse): Biến cái chuỗi "lằng nhằng" ?category=electronics&price_min=100 thành một object JavaScript "ngăn nắp", dễ đọc, dễ dùng { category: 'electronics', price_min: '100' }. Giống như bạn nhận được một bức thư mật mã và querystring.parse() là chìa khóa để giải mã nó vậy.
  • Mã hóa (Stringify): Ngược lại, khi bạn muốn gửi thông điệp đi, từ một object JavaScript "xịn sò" thành một chuỗi querystring chuẩn chỉnh để đính vào URL. querystring.stringify() sẽ giúp bạn "đóng gói" thông tin lại một cách an toàn và đúng định dạng.

Nói tóm lại, nó giúp chúng ta "giao tiếp" với URL một cách hiệu quả, "trao đổi" dữ liệu mà không cần phải "đau đầu" với việc xử lý chuỗi thủ công.

2. "Thực chiến" Code Ví Dụ: "Bắt tay" vào làm thôi!

Module này được tích hợp sẵn trong Node.js, nên bạn chỉ cần require là dùng được ngay.

Ví dụ 1: "Giải mã" Querystring (Parsing)

Giả sử bạn có một URL request từ trình duyệt và muốn lấy các tham số:

const querystring = require('querystring');

// Một chuỗi querystring "điển hình"
const queryStr = 'name=Creyt&age=30&city=Hanoi&hobbies=coding%2Cgaming';

// Sử dụng querystring.parse() để biến chuỗi thành object
const parsedObject = querystring.parse(queryStr);

console.log('Chuỗi gốc:', queryStr);
console.log('Object đã parse:', parsedObject);

// Bạn có thể truy cập dữ liệu dễ dàng như thế này:
console.log('Tên:', parsedObject.name);
console.log('Tuổi:', parsedObject.age);
console.log('Sở thích (đã decode):', parsedObject.hobbies); // Lưu ý: %2C sẽ được decode thành ,

/*
Output:
Chuỗi gốc: name=Creyt&age=30&city=Hanoi&hobbies=coding%2Cgaming
Object đã parse: {
  name: 'Creyt',
  age: '30',
  city: 'Hanoi',
  hobbies: 'coding,gaming'
}
Tên: Creyt
Tuổi: 30
Sở thích (đã decode): coding,gaming
*/

Bạn thấy đó, querystring.parse() đã tự động xử lý việc decodeURIComponent cho các giá trị (%2C thành ,), quá tiện lợi phải không?

Ví dụ 2: "Đóng gói" Querystring (Stringifying)

Bây giờ, nếu bạn có một object và muốn biến nó thành chuỗi để thêm vào URL:

const querystring = require('querystring');

// Một object chứa dữ liệu bạn muốn "đóng gói"
const dataObject = {
  product: 'MacBook Pro',
  color: 'Space Gray',
  price_range: '1500-2500',
  features: ['Retina Display', 'M2 Chip'] // Mảng sẽ được xử lý riêng
};

// Sử dụng querystring.stringify() để biến object thành chuỗi
const queryStringFromObject = querystring.stringify(dataObject);

console.log('Object gốc:', dataObject);
console.log('Chuỗi querystring đã stringify:', queryStringFromObject);

// Thử với một object có key trùng nhau (sẽ tạo thành mảng)
const dataWithDuplicates = {
    item: 'apple',
    item: 'banana' // Chỉ key cuối cùng được giữ lại nếu không dùng mảng
};
const queryStringDuplicates = querystring.stringify(dataWithDuplicates);
console.log('Chuỗi querystring với key trùng:', queryStringDuplicates);

// Nếu muốn nhiều giá trị cho một key, hãy dùng mảng trong object gốc:
const dataWithArray = {
    item: ['apple', 'banana']
};
const queryStringArray = querystring.stringify(dataWithArray);
console.log('Chuỗi querystring với mảng:', queryStringArray);

/*
Output:
Object gốc: { product: 'MacBook Pro', color: 'Space Gray', price_range: '1500-2500', features: [ 'Retina Display', 'M2 Chip' ] }
Chuỗi querystring đã stringify: product=MacBook%20Pro&color=Space%20Gray&price_range=1500-2500&features=Retina%20Display&features=M2%20Chip
Chuỗi querystring với key trùng: item=banana
Chuỗi querystring với mảng: item=apple&item=banana
*/

Thấy chưa? querystring.stringify() cũng tự động encodeURIComponent các giá trị (ví dụ: Space Gray thành Space%20Gray), và xử lý mảng bằng cách lặp lại key, mỗi lần một giá trị. "Ngầu" chưa!

Illustration

3. Mẹo (Best Practices) để "ghi điểm" và dùng "thực tế"

  • Hiểu về URL Encoding: Luôn nhớ rằng các ký tự đặc biệt như khoảng trắng, &, =, ?, /... cần phải được mã hóa (encoded) khi nằm trong giá trị của querystring để tránh "nhiễu sóng" hoặc lỗi cú pháp. querystring module tự động làm điều này, nhưng hiểu nguyên lý encodeURIComponentdecodeURIComponent là "điểm cộng" lớn.

  • Bảo mật là Vàng: Khi bạn nhận dữ liệu từ querystring (sau khi parse) và hiển thị trực tiếp lên trang web mà không "lọc" (sanitize) cẩn thận, bạn có thể bị tấn công XSS (Cross-Site Scripting). Luôn luôn "nghi ngờ" dữ liệu từ bên ngoài và xử lý nó an toàn trước khi hiển thị.

  • Modern Alternative: URLSearchParams: Trong Node.js (từ bản 7.0 trở lên) và đặc biệt là trong môi trường trình duyệt, bạn có một "người anh em" hiện đại hơn, mạnh mẽ hơn là URLSearchParams (một phần của module url trong Node.js). Nó cung cấp một API "giống trình duyệt" hơn, dễ dùng hơn cho các tác vụ phức tạp với URL. Nếu bạn đang làm việc với full URL hoặc cần tính tương thích cao với browser API, URLSearchParams thường là lựa chọn tốt hơn.

    const { URL } = require('url'); // Hoặc import { URL } from 'url';
    
    const myUrl = new URL('http://example.com/path?name=Creyt&age=30');
    const params = myUrl.searchParams;
    
    console.log(params.get('name')); // Creyt
    params.append('city', 'Hanoi');
    console.log(myUrl.toString()); // http://example.com/path?name=Creyt&age=30&city=Hanoi
    

    querystring vẫn "ổn áp" cho các trường hợp chỉ cần xử lý riêng phần chuỗi truy vấn mà không cần đến object URL đầy đủ.

4. Ứng dụng "chất lừ" trong thực tế

querystring (hoặc URLSearchParams) là "linh hồn" của rất nhiều ứng dụng web:

  • Trang Thương mại điện tử (E-commerce): Khi bạn lọc sản phẩm theo danh mục, giá, màu sắc... (/products?category=shoes&color=red&min_price=50).
  • Công cụ tìm kiếm: Rõ ràng nhất là khi bạn gõ từ khóa tìm kiếm (/search?q=nodejs+tutorial).
  • Phân trang (Pagination): Chuyển giữa các trang kết quả (/posts?page=2&limit=10).
  • API RESTful: Truyền các tham số cho API để filter, sort, paginate dữ liệu (/api/users?status=active&sort_by=name).
  • Hệ thống Analytics/Tracking: Các tham số utm_source, utm_medium trong các URL marketing để theo dõi nguồn truy cập.

5. Thử nghiệm và Nên dùng cho Case nào?

Thử nghiệm:

Bạn hãy thử tự xây dựng một HTTP server đơn giản trong Node.js. Server này sẽ lắng nghe các request và dùng querystring.parse() để đọc các tham số từ URL của request. Sau đó, nó sẽ trả về một trang HTML hiển thị các tham số đó. Đây là cách "vỡ lòng" để bạn thấy sức mạnh của nó.

const http = require('http');
const url = require('url');
const querystring = require('querystring');

const server = http.createServer((req, res) => {
    const parsedUrl = url.parse(req.url); // Phân tích URL đầy đủ
    const queryParams = querystring.parse(parsedUrl.query); // Lấy phần query và parse nó

    res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
    res.write('<h1>Chào mừng đến với Server của Creyt!</h1>');
    res.write('<p>Các tham số bạn gửi lên:</p>');
    res.write('<ul>');
    for (const key in queryParams) {
        res.write(`<li><strong>${key}:</strong> ${queryParams[key]}</li>`);
    }
    res.write('</ul>');
    res.end('<p>Thử truy cập: <a href="/?name=GenZDev&age=20">/?name=GenZDev&age=20</a></p>');
});

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

Lưu file này là server.js, chạy node server.js và truy cập http://localhost:3000/?name=Creyt&age=30&city=Hanoi. Bạn sẽ thấy các tham số được hiển thị trên trình duyệt!

Nên dùng cho Case nào:

  • Khi bạn cần xử lý riêng phần chuỗi truy vấn (query string) của URL: Ví dụ, bạn đã có sẵn req.url trong HTTP server của Node.js và chỉ muốn "bóc tách" phần ?key=value ra. querystring cực kỳ hiệu quả cho việc này.
  • Các dự án Node.js "thuần" (pure Node.js): Khi bạn không cần đến các tính năng đầy đủ của URL object hay sự tương thích với browser API mà chỉ muốn một cách nhanh chóng, nhẹ nhàng để parse/stringify.
  • Legacy code: Nếu bạn đang làm việc với các codebase cũ sử dụng querystring, việc hiểu và biết cách sử dụng nó là cần thiết.

Nhưng nhớ nhé, nếu bạn đang làm việc với các ứng dụng web hiện đại, đặc biệt là trong môi trường client-side (trình duyệt) hoặc cần một API mạnh mẽ hơn để thao tác với toàn bộ URL, URLSearchParams (trong module url của Node.js hoặc window.URLSearchParams trên trình duyệt) sẽ là "người bạn" tốt hơn.

Hy vọng bài viết này đã giúp bạn "thông não" về querystring module. Hãy "cày cuốc" và "phá đảo" những kiến thức mới nhé các "dev-er"!

Thuộc Series: Nodejs

Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!

#tech #cyberpunk #laravel
Chỉnh sửa bài viết

Bình luận (0)

Vui lòng Đăng Nhập để Bình luận

Hỗ trợ Markdown cơ bản
Nguyễn Văn A
1 ngày trước

Tính năng này đỉnh quá ad ơi, chờ mãi mới thấy một blog Tiếng Việt có UI/UX xịn như vầy!