fs.promises.readdir(): Radar quét kho báu trong Node.js
Nodejs

fs.promises.readdir(): Radar quét kho báu trong Node.js

Author

Admin System

@root

Ngày xuất bản

20 Mar, 2026

Lượt xem

3 Lượt

"fs.promises.readdir()"

Chào các "coder nhí" tương lai, hay đúng hơn là "phù thủy code" thế hệ mới! Anh Creyt đây, hôm nay chúng ta sẽ cùng "đào bới" một công cụ cực kỳ "xịn xò" trong Node.js, đó là fs.promises.readdir(). Nghe tên có vẻ hơi "học thuật" đúng không? Đừng lo, anh sẽ "phiên dịch" nó ra ngôn ngữ Gen Z dễ hiểu nhất.

1. fs.promises.readdir() là gì mà "hot" thế?

"Ngày xửa ngày xưa", khi các ứng dụng còn "ngây thơ", việc đọc danh sách file trong một thư mục giống như bạn mò mẫm trong một căn phòng tối đen, phải chờ từng món đồ hiện ra. Nhưng giờ đây, với fs.promises.readdir(), mọi thứ đã "lên level" rồi!

Hãy hình dung thế này: Thư mục của bạn là một "hang động bí mật" chứa đầy "kho báu" (các file và thư mục con). fs.promises.readdir() chính là "chiếc radar quét kho báu" siêu hiện đại của bạn. Nó không chỉ quét mà còn trả về danh sách tất cả "kho báu" trong "hang động" đó một cách nhanh như chớpkhông làm tắc nghẽn công việc chính của bạn. Tại sao lại nhanh như chớp? Vì nó dùng "promises" – một cơ chế bất đồng bộ (asynchronous) giúp Node.js không phải "đứng đợi" mà có thể làm nhiều việc cùng lúc, y như bạn vừa chat Zalo vừa lướt TikTok vậy!

Tóm lại: fs.promises.readdir() là một hàm trong module fs.promises của Node.js, dùng để đọc và trả về một mảng chứa tên tất cả các file và thư mục con có trong một thư mục cụ thể. Vì nó trả về một Promise, nên chúng ta thường dùng async/await để code "mượt mà" và dễ đọc hơn, tránh "callback hell" mà các "tiền bối" ngày xưa hay gặp phải.

2. Code Ví Dụ Minh Họa: "Thực hành là chân lý!"

Giờ thì "xắn tay áo" vào code thôi. Anh sẽ cho các bạn xem cách chiếc radar này hoạt động.

Ví dụ 1: Quét kho báu trong thư mục hiện tại

Giả sử bạn có cấu trúc thư mục như sau:

my-project/
├── index.js
├── data/
│   ├── users.json
│   └── products.csv
└── utils.js

Và bạn muốn đọc nội dung thư mục my-project (nơi index.js đang chạy):

// index.js
const { readdir } = require('fs').promises;
const path = require('path');

async function listDirectoryContents(directoryPath) {
  try {
    const files = await readdir(directoryPath); // 'Quét' thư mục
    console.log(`
Kho báu trong hang động '${directoryPath}':`);
    for (const file of files) {
      console.log(`- ${file}`); // In ra từng 'kho báu'
    }
  } catch (err) {
    console.error(`
Ối! Radar bị nhiễu sóng khi quét '${directoryPath}':`, err);
  }
}

// Quét thư mục hiện tại
listDirectoryContents('./'); 

// Hoặc quét một thư mục con cụ thể
listDirectoryContents('./data');

Khi chạy node index.js, bạn sẽ thấy output đại loại như:

Kho báu trong hang động './':
- index.js
- data
- utils.js

Kho báu trong hang động './data':
- users.json
- products.csv

Ví dụ 2: Lọc "kho báu" theo loại (file hay folder)?

Đôi khi bạn muốn biết rõ hơn về từng "kho báu" (nó là file hay folder). readdir có một option "xịn sò" tên là withFileTypes: true.

const { readdir } = require('fs').promises;
const path = require('path');

async function listDetailedContents(directoryPath) {
  try {
    // 'Quét' với option để biết loại 'kho báu'
    const dirents = await readdir(directoryPath, { withFileTypes: true }); 

    console.log(`
Phân loại kho báu trong hang động '${directoryPath}':`);
    for (const dirent of dirents) {
      if (dirent.isDirectory()) {
        console.log(`[FOLDER] ${dirent.name}`);
      } else if (dirent.isFile()) {
        console.log(`[FILE] ${dirent.name}`);
      } else {
        console.log(`[KHÁC] ${dirent.name}`); // Ví dụ: symbolic link
      }
    }
  } catch (err) {
    console.error(`
Radar bị lỗi khi phân loại kho báu trong '${directoryPath}':`, err);
  }
}

listDetailedContents('./');

Output sẽ có dạng:

Phân loại kho báu trong hang động './':
[FILE] index.js
[FOLDER] data
[FILE] utils.js
Illustration

3. Mẹo (Best Practices) để "hack" hiệu quả hơn!

Anh Creyt có vài "chiêu" bỏ túi để các bạn dùng readdir "thần sầu" hơn:

  • "Bất đồng bộ hóa" là chân ái: Luôn luôn ưu tiên dùng fs.promises.readdir() thay vì fs.readdir() truyền thống. Dùng async/await làm code của bạn "sáng sủa" như đèn pha ô tô, dễ đọc, dễ bảo trì, và tránh "callback hell" ám ảnh. Đừng bao giờ quay lại "thời đồ đá" với callback nữa nhé!
  • "Bình chữa cháy" try...catch: Không phải lúc nào đường đi cũng "phẳng lì". Thư mục có thể không tồn tại, hoặc bạn không có quyền truy cập. Luôn luôn "thủ sẵn" try...catch để "dập lửa" khi có lỗi xảy ra. Nếu không, app của bạn sẽ "bay màu" ngay lập tức đấy!
  • Đường dẫn "chuẩn chỉ" với path.join: Đừng bao giờ tự nối chuỗi để tạo đường dẫn file/thư mục. Hãy dùng path.join() để đảm bảo đường dẫn của bạn hoạt động "ngon lành cành đào" trên mọi hệ điều hành (Windows dùng \, Linux/macOS dùng /).
  • withFileTypes: true - "Biết người biết ta, trăm trận trăm thắng": Nếu bạn cần phân biệt đâu là file, đâu là folder, hãy dùng option này. Nó giúp bạn có thông tin chi tiết hơn mà không cần phải gọi thêm stat() cho từng item, tiết kiệm tài nguyên và thời gian.
  • Cẩn thận với thư mục "khổng lồ": Quét một thư mục chứa hàng ngàn, thậm chí hàng triệu file/folder có thể tốn rất nhiều tài nguyên và thời gian. Hãy cân nhắc kỹ hoặc tìm cách tối ưu (ví dụ: chỉ quét một phần, dùng lazy loading) nếu bạn phải làm việc với các thư mục "quá khổ" như vậy. Nó giống như bạn quét cả một kho vũ khí vậy, phải có chiến thuật rõ ràng!

4. Ứng dụng thực tế: "Radar" này dùng ở đâu?

fs.promises.readdir() không chỉ là lý thuyết, nó được ứng dụng "rộng rãi" trong thế giới thực:

  • File Explorers / Hệ thống quản lý nội dung (CMS): Các ứng dụng như Netlify CMS, Strapi, hoặc thậm chí là giao diện quản lý file trên server của bạn, đều cần readdir để hiển thị danh sách file và thư mục cho người dùng.
  • Build Tools (Webpack, Gulp, Vite): Khi bạn build một dự án, các công cụ này cần "quét" qua các thư mục src để tìm tất cả các file mã nguồn (JavaScript, CSS, ảnh...) để nén, biên dịch, hoặc tối ưu hóa.
  • Static Site Generators (Next.js, Gatsby, Astro): Các framework này thường đọc các file Markdown hoặc JSON trong một thư mục cụ thể để tự động tạo ra các trang web tĩnh. Ví dụ, đọc tất cả các file .md trong thư mục posts để tạo ra các bài blog.
  • APIs phục vụ download/upload file: Một API cho phép người dùng download các file đã có sẵn trên server thường dùng readdir để liệt kê các file đó trước khi gửi cho client.

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

Thử nghiệm:

Để "nắm bắt" nó tốt hơn, bạn hãy:

  1. Tạo một thư mục mới, ví dụ test-folder.
  2. Bên trong test-folder, tạo vài file (ví dụ: a.txt, b.json) và vài thư mục con (ví dụ: sub-folder1, sub-folder2).
  3. Trong sub-folder1, tạo thêm một file c.js.
  4. Chạy code ví dụ của anh để quét test-foldertest-folder/sub-folder1. Quan sát output và thử các option khác nhau.
  5. Thử quét một thư mục không tồn tại hoặc bạn không có quyền truy cập để xem cách try...catch "cứu nguy" như thế nào.

Nên dùng fs.promises.readdir() khi:

  • Bạn cần hiển thị danh sách file/thư mục lên giao diện người dùng (dashboard, quản lý file).
  • Bạn muốn xử lý hàng loạt file trong một thư mục (ví dụ: đổi tên tất cả file ảnh, xóa các file tạm).
  • Bạn cần tạo cấu trúc thư mục động hoặc kiểm tra sự tồn tại của các tài nguyên dựa trên danh sách file/thư mục.
  • Bạn đang xây dựng một ứng dụng backend cần tương tác với hệ thống file của server để đọc/ghi các tài nguyên.

Không nên dùng fs.promises.readdir() khi:

  • Bạn chỉ cần đọc nội dung của một file cụ thể (hãy dùng fs.promises.readFile()).
  • Bạn chỉ cần kiểm tra sự tồn tại của một file hoặc thư mục mà không cần danh sách bên trong (hãy dùng fs.promises.access()).

Vậy đó, fs.promises.readdir() không chỉ là một công cụ, nó là "chiếc radar" giúp bạn "thám hiểm" và "quản lý" thế giới file của Node.js một cách "thông minh" và "hiệu quả" hơn. Hãy "cầm lấy" nó và bắt đầu "khám phá" những điều thú vị nhé! Chúc các bạn code "mượt mà"!

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!