fs.mkdirSync(): Phép thuật tạo folder 'tức thì' trong Node.js
Nodejs

fs.mkdirSync(): Phép thuật tạo folder 'tức thì' trong Node.js

Author

Admin System

@root

Ngày xuất bản

20 Mar, 2026

Lượt xem

2 Lượt

"fs.mkdirSync()"

Chào các "thánh code" Gen Z! Hôm nay, anh Creyt sẽ "khui" một "bí kíp" mà tưởng chừng đơn giản nhưng lại cực kỳ quyền năng trong thế giới Node.js: fs.mkdirSync(). Nghe cái tên đã thấy "ngầu" rồi đúng không? Đừng lo, anh sẽ "mổ xẻ" nó một cách dễ hiểu nhất, đảm bảo "ngấm" ngay!

1. fs.mkdirSync(): "Thợ xây" thư mục siêu tốc của Node.js là gì?

"Ngày xửa ngày xưa", khi các bạn muốn lưu trữ ảnh, video, hay bất kỳ "tài sản số" nào đó trên máy tính, các bạn thường tạo một cái thư mục (folder) bằng cách click chuột phải, chọn "New Folder" đúng không? Trong lập trình, đặc biệt là với Node.js, chúng ta cũng cần một "người" làm công việc đó một cách tự động, theo "kịch bản" của mình. Và đó chính là lúc fs.mkdirSync() "xuất hiện"!

Hiểu đơn giản, fs.mkdirSync() là một "công cụ" trong module fs (File System) của Node.js, cho phép bạn tạo một thư mục mới ngay lập tức, tại một đường dẫn cụ thể. Cái chữ Sync ở cuối tên nó có nghĩa là "đồng bộ" (synchronous). Tức là, khi bạn gọi hàm này, toàn bộ chương trình của bạn sẽ "đứng hình" một chút để chờ cho đến khi thư mục được tạo xong xuôi, rồi mới tiếp tục chạy các dòng code tiếp theo. Giống như bạn đang xây nhà vậy, phải "đổ móng" xong xuôi thì mới tính đến chuyện "xây tường", "lợp mái" được, đúng không?

2. Sức mạnh của fs.mkdirSync(): Để làm gì trong thế giới code?

Khi nào thì chúng ta cần đến "thợ xây" này? Nhiều lắm chứ!

  • Tổ chức "gia tài số": Tưởng tượng bạn đang xây dựng một ứng dụng cho phép người dùng upload ảnh. Mỗi khi có ảnh mới, bạn muốn lưu nó vào một thư mục riêng biệt, ví dụ /uploads/user_id_123/ hoặc /uploads/2023-10-27/. fs.mkdirSync() chính là "trợ thủ" đắc lực giúp bạn tạo ra các thư mục này một cách tự động.
  • Dọn dẹp "nhà cửa": Khi ứng dụng khởi động, bạn muốn chắc chắn rằng các thư mục quan trọng như logs (để ghi lại nhật ký), cache (để lưu dữ liệu tạm), hoặc temp (để chứa file tạm thời) đã tồn tại. Nếu chưa, fs.mkdirSync() sẽ "ra tay" tạo chúng ngay.
  • "Đóng gói" dự án: Trong các dự án lớn, bạn có thể cần tạo ra một cấu trúc thư mục phức tạp cho các module, component, hay môi trường khác nhau. fs.mkdirSync() có thể giúp bạn tự động hóa quy trình này.
Illustration

3. "Phép thuật" Code Ví Dụ: Dùng fs.mkdirSync() thế nào cho chuẩn bài?

Để dùng fs.mkdirSync(), bạn cần "triệu hồi" module fs trước. Cú pháp cơ bản của nó là fs.mkdirSync(path, [options]).

const fs = require('fs');
const path = require('path'); // Module 'path' giúp xử lý đường dẫn dễ dàng hơn

// 1. Tạo thư mục đơn giản: Ví dụ 'uploads' để chứa file tải lên
console.log('--- Ví dụ 1: Tạo thư mục đơn giản ---');
try {
    const dirName = 'uploads';
    if (!fs.existsSync(dirName)) { // Luôn kiểm tra xem thư mục đã tồn tại chưa
        fs.mkdirSync(dirName);
        console.log(`Thư mục '${dirName}' đã được tạo thành công!`);
    } else {
        console.log(`Thư mục '${dirName}' đã tồn tại. Không cần tạo lại.`);
    }
} catch (err) {
    console.error("Lỗi khi tạo thư mục đơn giản:", err.message); // Bắt lỗi và in ra
}

// 2. Tạo thư mục lồng nhau (nested directories): Ví dụ 'data/images/thumbnails'
console.log('\n--- Ví dụ 2: Tạo thư mục lồng nhau ---');
try {
    const nestedDirPath = path.join('data', 'images', 'thumbnails');
    // Với option { recursive: true }, Node.js sẽ tự động tạo các thư mục 'cha' nếu chúng chưa tồn tại
    if (!fs.existsSync(nestedDirPath)) {
        fs.mkdirSync(nestedDirPath, { recursive: true });
        console.log(`Thư mục lồng nhau '${nestedDirPath}' đã được tạo thành công!`);
    } else {
        console.log(`Thư mục lồng nhau '${nestedDirPath}' đã tồn tại.`);
    }
} catch (err) {
    console.error("Lỗi khi tạo thư mục lồng nhau:", err.message);
}

// 3. Tạo thư mục với quyền truy cập (permissions): Ví dụ 'private_data' chỉ chủ sở hữu được đọc/ghi/thực thi
console.log('\n--- Ví dụ 3: Tạo thư mục với quyền truy cập ---');
try {
    const securedDir = 'private_data';
    if (!fs.existsSync(securedDir)) {
        // mode: 0o700 nghĩa là: chỉ chủ sở hữu có quyền đọc (4), ghi (2), thực thi (1) => 4+2+1 = 7
        // Các nhóm khác và người dùng khác không có quyền gì (0)
        fs.mkdirSync(securedDir, { mode: 0o700 }); 
        console.log(`Thư mục '${securedDir}' với quyền 0o700 đã được tạo.`);
    } else {
        console.log(`Thư mục '${securedDir}' đã tồn tại.`);
    }
} catch (err) {
    console.error("Lỗi khi tạo thư mục với quyền:", err.message);
}

// Cleanup (Xóa các thư mục đã tạo để chạy lại ví dụ)
// console.log('\n--- Cleanup: Xóa thư mục ---');
// try {
//     fs.rmSync('uploads', { recursive: true, force: true });
//     fs.rmSync('data', { recursive: true, force: true });
//     fs.rmSync('private_data', { recursive: true, force: true });
//     console.log('Đã xóa các thư mục thử nghiệm.');
// } catch (err) {
//     console.error("Lỗi khi xóa thư mục:", err.message);
// }

4. Mẹo "nhà nghề" từ Creyt: Dùng sao cho "pro"?

Muốn "lên trình" với fs.mkdirSync(), các bạn nhớ "bỏ túi" mấy cái mẹo này nhé:

  • "Check hàng" trước khi "xuất chiêu": Luôn dùng fs.existsSync(path) để kiểm tra xem thư mục đã tồn tại chưa trước khi gọi fs.mkdirSync(). Điều này giúp bạn tránh được lỗi không đáng có và làm cho code "thân thiện" hơn.
  • "Đánh nhanh thắng nhanh" với recursive: true: Khi bạn cần tạo một "chuỗi" thư mục lồng nhau (ví dụ: a/b/c/d), hãy dùng fs.mkdirSync(path, { recursive: true }). Node.js sẽ tự động tạo tất cả các thư mục "cha" nếu chúng chưa tồn tại. Tuyệt vời hơn là nếu thư mục cuối cùng đã tồn tại, nó sẽ không báo lỗi mà chỉ đơn giản là không làm gì cả. "Nhàn" hơn bao nhiêu là tự tay tạo từng cái, đúng không?
  • "Đề phòng bất trắc" với try...catch: Dù đã kiểm tra trước, nhưng trong thế giới code, "chuyện gì cũng có thể xảy ra". Hãy luôn bọc fs.mkdirSync() trong khối try...catch để "bắt" và xử lý những lỗi không mong muốn (ví dụ: không có quyền tạo thư mục, đường dẫn không hợp lệ, v.v.).
  • Hiểu rõ "tính cách" Sync: Nhớ rằng Sync có nghĩa là chặn luồng. Điều này ổn trong các script chạy một lần, hoặc khi khởi động ứng dụng. Nhưng tuyệt đối không nên dùng nó trong các tác vụ "nóng", liên tục của một server web (như xử lý request API), vì nó sẽ làm server của bạn "đứng hình" và "delay" tất cả các request khác. Trong những trường hợp đó, hãy dùng "anh em" của nó là fs.mkdir() (dạng callback) hoặc fs.promises.mkdir() (dạng Promise) để xử lý bất đồng bộ.
  • "Bảo mật thông tin" với mode: Nếu thư mục bạn tạo chứa dữ liệu nhạy cảm, đừng quên đặt quyền truy cập (permissions) bằng option mode (ví dụ: 0o700 chỉ cho chủ sở hữu đọc/ghi/thực thi). Đây là một "thói quen tốt" của một dev "có tâm".

5. Ứng dụng thực tế: Ai đang "xài" fs.mkdirSync()?

Các bạn có thể thấy fs.mkdirSync() (hoặc phiên bản async của nó) ở khắp mọi nơi trong các ứng dụng Node.js "đời thực":

  • Hệ thống quản lý file: Các ứng dụng như Dropbox, Google Drive, hoặc bất kỳ website nào cho phép người dùng upload file đều cần tạo thư mục để lưu trữ dữ liệu. Ví dụ, mỗi khi một người dùng mới đăng ký, server có thể tự động tạo một thư mục riêng cho họ để lưu trữ tài liệu.
  • Framework và CMS: Các framework như Next.js, Nuxt.js, hoặc các CMS (Content Management System) như Strapi, Ghost thường tạo các thư mục cache, logs, uploads khi ứng dụng được khởi tạo hoặc deploy lần đầu.
  • Ứng dụng ghi log: Các hệ thống ghi nhật ký (logging systems) sẽ cần tạo thư mục để lưu trữ các file log theo ngày, theo loại, hoặc theo module.
  • CI/CD Pipelines: Trong các quy trình tích hợp liên tục/triển khai liên tục (CI/CD), các script có thể tạo ra các thư mục tạm thời để lưu trữ các artifact (sản phẩm xây dựng) hoặc kết quả test.

6. Thử nghiệm và hướng dẫn: Khi nào nên "xuất chiêu"?

Với fs.mkdirSync(), chúng ta có một "vũ khí" mạnh mẽ nhưng cần dùng đúng lúc, đúng chỗ.

  • Nên dùng cho các "case" này:

    • Khởi động ứng dụng: Khi ứng dụng Node.js của bạn vừa "thức giấc", việc kiểm tra và tạo các thư mục cần thiết cho logs, uploads, cache... là một tác vụ "một lần" và không ảnh hưởng nhiều đến hiệu suất. Đây là lúc fs.mkdirSync() "tỏa sáng" vì sự đơn giản và dễ đọc của nó.
    • Các script tiện ích (CLI tools, utility scripts): Những script chạy từ dòng lệnh, thực hiện các tác vụ quản trị, sao lưu, hoặc tạo cấu trúc dự án. Trong những trường hợp này, việc chặn luồng không phải là vấn đề lớn.
    • Trong quá trình cài đặt (installation scripts): Khi bạn cài đặt một package Node.js hoặc một ứng dụng, script cài đặt có thể dùng fs.mkdirSync() để tạo các thư mục cấu hình mặc định.
  • Không nên dùng (hoặc cân nhắc kỹ) cho các "case" này:

    • Trong các hàm xử lý request của server web (ví dụ: Express routes): Đây là "điều cấm kỵ" mà anh Creyt muốn nhấn mạnh. Nếu bạn dùng fs.mkdirSync() để tạo thư mục mỗi khi có một request đến server, server của bạn sẽ "đứng hình" và không thể xử lý các request khác cho đến khi tác vụ tạo thư mục hoàn thành. Hãy dùng fs.mkdir() hoặc fs.promises.mkdir() để xử lý bất đồng bộ, giữ cho server "mượt mà" như lụa.

Nhớ kỹ, "sức mạnh đi kèm trách nhiệm"! Hiểu rõ công cụ của mình sẽ giúp bạn trở thành một "dev xịn xò" hơn. Giờ thì, "triển" thôi nào!

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!