fs.mkdir(): 'Xây Nhà' Cho App Node.js Của Gen Z
Nodejs

fs.mkdir(): 'Xây Nhà' Cho App Node.js Của Gen Z

Author

Admin System

@root

Ngày xuất bản

20 Mar, 2026

Lượt xem

6 Lượt

"fs.mkdir()"

Anh em Gen Z thân mến, hôm nay anh Creyt sẽ dẫn dắt chúng ta đi "xây nhà" cho ứng dụng Node.js của mình. Nghe thì có vẻ "hàn lâm" nhưng thực ra nó là một trong những kỹ năng "sinh tồn" cơ bản nhất của một "thợ code" chính hiệu đấy!

🏗️ fs.mkdir(): Kiến Trúc Sư Của Thư Mục

Bạn cứ hình dung thế này: Ứng dụng của bạn giống như một căn nhà "full nội thất" vậy. Nhưng để căn nhà đó hoạt động trơn tru, bạn cần có những "căn phòng" (thư mục) để chứa "đồ đạc" (các file ảnh, file log, file dữ liệu...). Mà "đồ đạc" thì đâu thể cứ vứt lung tung được, phải không?

fs.mkdir() chính là kiến trúc sư trưởng của bạn trong Node.js, chuyên trách nhiệm vụ tạo ra các thư mục mới trong hệ thống file. Nó nằm trong module fs (File System) – bộ công cụ "quản lý nhà cửa" mạnh mẽ của Node.js.

Để làm gì ư? Đơn giản là để:

  • Tổ chức dữ liệu: Tách riêng ảnh của user này vào thư mục riêng, log của ngày hôm nay vào thư mục khác. Giúp mọi thứ ngăn nắp, dễ tìm, dễ quản lý.
  • Lưu trữ file tạm: Tạo nơi chứa các file "tạm trú" trong quá trình xử lý.
  • Cấu trúc dự án động: Khi bạn cần tạo ra các cấu trúc thư mục đặc thù dựa trên logic của ứng dụng.

🛠️ Code Ví Dụ: Bắt Tay Vào Xây Dựng

Giờ thì "xắn tay áo" lên và "xây" thôi! Anh Creyt sẽ "tặng" các bạn vài "bản vẽ" (code ví dụ) chuẩn chỉnh nhất.

1. Dùng Callback (Kiểu truyền thống – hơi "cổ" nhưng vẫn chạy tốt)

Đây là cách bạn "giao việc" cho fs.mkdir() và "chờ điện thoại" (callback) báo lại khi việc xong hoặc có lỗi.

const fs = require('fs');

const folderName = './myNewFolderCallback';

fs.mkdir(folderName, (err) => {
  if (err) {
    if (err.code === 'EEXIST') {
      console.error(`Thư mục '${folderName}' đã tồn tại rồi, anh bạn!`);
    } else {
      console.error('Ối giời ơi, có lỗi rồi:', err);
    }
    return;
  }
  console.log(`Đã xây xong thư mục '${folderName}' một cách ngon lành!`);
});

Giải thích:

  • Chúng ta truyền tên thư mục và một hàm callback. Hàm này sẽ được gọi khi mkdir hoàn thành hoặc gặp lỗi.
  • err.code === 'EEXIST' là "mã lỗi" khi thư mục bạn muốn tạo đã có sẵn. Rất quan trọng để kiểm tra!

2. Dùng Promises (Kiểu hiện đại – phong cách Gen Z)

Đây là cách anh Creyt khuyến khích các bạn dùng. Nó "sáng sủa" hơn rất nhiều, đặc biệt khi dùng với async/await. Cứ như bạn "đặt hàng online" vậy: đặt xong là xong, không cần chờ đợi "tại chỗ", khi nào có kết quả thì ứng dụng của bạn "nhận thông báo".

const fs = require('fs').promises; // Lưu ý: dùng fs.promises

async function createFolderAsync(folderName) {
  try {
    await fs.mkdir(folderName);
    console.log(`Đã xây xong thư mục '${folderName}' bằng Promise/async-await!`);
  } catch (err) {
    if (err.code === 'EEXIST') {
      console.error(`Thư mục '${folderName}' đã tồn tại, không cần xây lại.`);
    } else {
      console.error('Đã có một sự cố xây dựng:', err);
    }
  }
}

createFolderAsync('./myNewFolderPromise');
createFolderAsync('./myNewFolderPromise'); // Thử tạo lại để xem lỗi EEXIST

Giải thích:

  • Chúng ta dùng require('fs').promises để lấy phiên bản Promise của các hàm fs.
  • async/await giúp code đọc tuần tự hơn, dù bên dưới nó vẫn là bất đồng bộ.
  • try...catch là "đội bảo hiểm" của bạn, giúp bắt các lỗi xảy ra trong quá trình "xây dựng".

3. Tạo Thư Mục Lồng Nhau (Recursive – "Xây chung cư" một phát ăn ngay)

Nếu bạn muốn tạo một chuỗi thư mục như uploads/2023/10/images, bạn không cần tạo từng cái một. Chỉ cần thêm recursive: true!

const fs = require('fs').promises;

async function createNestedFolders(path) {
  try {
    await fs.mkdir(path, { recursive: true });
    console.log(`Đã tạo toàn bộ 'chung cư' tại '${path}' thành công!`);
  } catch (err) {
    console.error('Lỗi khi xây chung cư:', err);
  }
}

createNestedFolders('./uploads/2024/01/avatars');

Giải thích:

  • Option { recursive: true } là "siêu năng lực" giúp mkdir tạo tất cả các thư mục cha mẹ nếu chúng chưa tồn tại. Tuyệt vời ông mặt trời!

4. fs.mkdirSync() (Cẩn thận kẻo "tắc đường" app)

Đây là phiên bản đồng bộ. Tức là, ứng dụng của bạn sẽ đứng yên chờ đợi cho đến khi thư mục được tạo xong mới làm việc khác. Trong môi trường server Node.js, điều này giống như "giao thông tắc nghẽn" vậy, làm chậm cả hệ thống. Hạn chế dùng trừ khi bạn thực sự hiểu rõ và chấp nhận rủi ro.

const fs = require('fs');

try {
  fs.mkdirSync('./mySyncFolder');
  console.log('Đã tạo thư mục đồng bộ ngon lành.');
} catch (err) {
  if (err.code === 'EEXIST') {
    console.error('Thư mục đồng bộ đã có.');
  } else {
    console.error('Lỗi khi tạo thư mục đồng bộ:', err);
  }
}
Illustration

💡 Mẹo "Sống Còn" & Best Practices Từ Anh Creyt

Để trở thành một "thợ code" chuyên nghiệp, đừng quên những mẹo này:

  1. "Tối ưu hóa công trường" với async/await: Luôn ưu tiên dùng fs.promises.mkdir() kết hợp async/await. Code của bạn sẽ "sáng sủa", dễ đọc và dễ bảo trì hơn rất nhiều. Hạn chế callback "rườm rà" và Sync "gây tắc nghẽn".
  2. "Đội bảo hiểm" try...catch: Luôn luôn bọc các thao tác fs trong try...catch (hoặc xử lý lỗi trong callback). Bạn không muốn ứng dụng của mình "sập" chỉ vì một lỗi tạo thư mục nhỏ nhặt đâu.
  3. "Kiểm tra hiện trạng" EEXIST: Khi tạo thư mục, hãy luôn kiểm tra lỗi EEXIST. Nếu thư mục đã tồn tại, thường thì bạn không cần làm gì cả, hoặc đơn giản là báo lại cho người dùng biết.
  4. "Xây chung cư tự động" với recursive: true: Khi cần tạo nhiều thư mục lồng nhau, đừng ngần ngại dùng { recursive: true }. Nó sẽ giúp bạn tiết kiệm "công sức" viết code rất nhiều.
  5. "Suy nghĩ trước khi 'xây'": Trước khi tạo một thư mục, hãy tự hỏi: "Thư mục này dùng để làm gì? Tên có rõ ràng không? Có cần thiết không?". Tránh tạo ra các thư mục "rác" làm lộn xộn hệ thống.

🌍 Ứng Dụng Thực Tế: fs.mkdir() "Làm Được Gì"?

Bạn sẽ thấy fs.mkdir() xuất hiện "khắp mọi nơi" trong các ứng dụng thực tế:

  • Hệ thống upload file (Facebook, Instagram, Google Drive): Khi bạn upload ảnh, video, hệ thống có thể tạo các thư mục riêng biệt cho từng người dùng, hoặc theo ngày tháng để dễ quản lý. Ví dụ: uploads/user_id/images/, uploads/2023/10/videos/.
  • Hệ thống cache dữ liệu: Các ứng dụng web thường tạo thư mục cache để lưu trữ các tài nguyên tĩnh (CSS, JS, hình ảnh đã nén) nhằm tăng tốc độ tải trang.
  • Ghi log hệ thống (Server logs): Các server thường tạo thư mục log theo ngày (ví dụ: logs/2023-10-27.log) hoặc theo loại log để dễ dàng theo dõi và debug.
  • Công cụ dòng lệnh (CLI Tools): Khi bạn chạy các lệnh như npm init hoặc create-react-app, chúng sẽ tạo ra một cấu trúc thư mục dự án mới tinh cho bạn. Đó chính là fs.mkdir() đang "làm việc" đấy!

🧪 Thử Nghiệm & Nên Dùng Cho Case Nào?

Thử nghiệm đã từng: Anh Creyt từng dùng fs.mkdir() để tự động tạo cấu trúc thư mục cho các dự án mới của mình. Chỉ cần chạy một script, là có ngay "căn nhà" với đầy đủ "phòng khách, phòng ngủ" (src, public, controllers, models...) mà không cần click chuột tay bo. Tiết kiệm thời gian "khởi công" cực kỳ!

Nên dùng cho case nào?

  • Quản lý file người dùng: Bất cứ khi nào bạn cần một nơi riêng để lưu trữ tài liệu, ảnh, video của từng người dùng trên server.
  • Tổ chức dữ liệu động: Khi ứng dụng của bạn cần tạo ra các thư mục để phân loại dữ liệu theo tiêu chí nào đó (ví dụ: theo loại sản phẩm, theo ngày, theo trạng thái).
  • Tạo môi trường làm việc: Khi bạn cần khởi tạo một môi trường hoặc cấu trúc file nhất định cho một tác vụ nào đó (ví dụ: thư mục tạm cho quá trình xử lý ảnh, thư mục output cho file nén).

Nhớ nhé, fs.mkdir() không chỉ là một lệnh đơn thuần, nó là "nền móng" cho một hệ thống file được tổ chức "khoa học" và "bền vững". Hãy thực hành thật nhiều để "nắm chắc trong tay" công cụ "xây dựng" này, anh em Gen Z nhé!

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!