fs.promises.writeFile(): Bậc thầy lưu trữ của dân code Gen Z!
Nodejs

fs.promises.writeFile(): Bậc thầy lưu trữ của dân code Gen Z!

Author

Admin System

@root

Ngày xuất bản

20 Mar, 2026

Lượt xem

3 Lượt

"fs.promises.writeFile()"

Chào các "coder nhí" tương lai và hiện tại của Node.js! Anh Creyt lại lên sóng đây. Hôm nay, chúng ta sẽ "mổ xẻ" một "công cụ" cực kỳ quyền năng trong bộ "đồ nghề" của dân lập trình, đặc biệt là khi các em làm việc với Node.js: chính là fs.promises.writeFile(). Nghe tên dài ngoằng vậy thôi chứ "công năng" của nó thì bá đạo lắm!

1. fs.promises.writeFile() là gì mà Gen Z phải biết?

"fs" ở đây viết tắt của File System, tức là hệ thống file. "promises" thì như các em biết, nó là lời hứa, là cam kết sẽ hoàn thành một tác vụ nào đó trong tương lai mà không làm "treo" máy. Còn "writeFile" thì đơn giản là "viết vào file". Ghép lại, fs.promises.writeFile() chính là "Thư ký tốc ký siêu đẳng" của Node.js, chuyên nhận nhiệm vụ ghi dữ liệu vào một file nào đó một cách bất đồng bộ.

Em hình dung thế này: Em là một đầu bếp (chương trình Node.js của em), đang bận rộn làm món ăn (xử lý các tác vụ khác). Bỗng dưng, em cần ghi lại công thức mới vào cuốn sổ tay (ghi dữ liệu vào file). Nếu em tự mình dừng mọi thứ lại để ngồi viết từng chữ (tác vụ đồng bộ - fs.writeFileSync), thì món ăn sẽ nguội mất, khách hàng sẽ "quay xe".

Nhưng với fs.promises.writeFile(), em chỉ cần nói với "trợ lý ảo" (cái Promise) của mình: "Ê, ghi giúp anh cái công thức này vào file mon_moi.txt nhé!". Trợ lý sẽ nhận lệnh và âm thầm làm việc của mình, trong khi em vẫn tiếp tục "xào nấu" các món khác. Khi trợ lý làm xong, nó sẽ "báo cáo" lại cho em biết là thành công hay thất bại. Tuyệt vời không?

Tóm lại, nó dùng để: Ghi nội dung (chuỗi, buffer) vào một file cụ thể trên ổ đĩa. Điểm mấu chốt là bất đồng bộ, giúp ứng dụng của em luôn mượt mà, không bị "đứng hình" khi đang ghi file, đặc biệt quan trọng với các ứng dụng web, API server.

2. Code Ví Dụ Minh Hoạ: "Viết là phải có code!"

Thôi lý thuyết suông mãi chán lắm, anh em mình vào "thực chiến" luôn. Để dùng fs.promises, đầu tiên các em phải "import" nó vào đã:

import { writeFile } from 'fs/promises'; // Cách hiện đại dùng ES Modules
// Hoặc nếu dùng CommonJS:
// const { writeFile } = require('fs').promises;

async function ghiDuLieuVaoFile() {
  const tenFile = 'thong_tin_genz.txt';
  const duLieu = 'Tên: Nguyễn Văn A\nTuổi: 18\nSở thích: Code, TikTok, Game';

  try {
    await writeFile(tenFile, duLieu);
    console.log(`✅ Đã ghi dữ liệu thành công vào file: ${tenFile}`);
  } catch (error) {
    console.error('❌ Lỗi khi ghi file:', error.message);
  }
}

ghiDuLieuVaoFile();

Giải thích nhanh:

  • import { writeFile } from 'fs/promises';: Chúng ta lấy hàm writeFile từ module fs/promises.
  • async function ghiDuLieuVaoFile(): Vì writeFile trả về một Promise, chúng ta cần dùng async/await để xử lý nó một cách tuần tự (nhưng vẫn bất đồng bộ ở nền).
  • await writeFile(tenFile, duLieu);: Đây là "phép thuật" chính! Nó sẽ ghi duLieu vào tenFile. Chương trình sẽ "đợi" cho đến khi tác vụ ghi file hoàn tất rồi mới đi tiếp, nhưng quan trọng là nó không chặn các tác vụ khác chạy song song.
  • try...catch: "Bảo hiểm" của chúng ta. Nếu có bất kỳ lỗi nào xảy ra trong quá trình ghi file (ví dụ: không có quyền ghi, đường dẫn sai, ổ đĩa đầy), catch sẽ "tóm" lấy lỗi đó và chúng ta có thể xử lý nó.

Ví dụ nâng cao hơn một chút: Ghi một đối tượng JSON

Gợi Ý Đọc Tiếp
Node.js Path Module: GPS cho file của GenZ!

2 Lượt xem

import { writeFile } from 'fs/promises';

async function ghiJsonObjectVaoFile() {
  const tenFileJson = 'cau_hinh_app.json';
  const cauHinh = {
    appName: 'GenZ_ChatApp',
    version: '1.0.0',
    debugMode: true,
    users: ['creyt', 'alice', 'bob']
  };

  try {
    // JSON.stringify để chuyển object thành chuỗi JSON
    await writeFile(tenFileJson, JSON.stringify(cauHinh, null, 2));
    console.log(`✅ Đã ghi đối tượng JSON thành công vào file: ${tenFileJson}`);
  } catch (error) {
    console.error('❌ Lỗi khi ghi file JSON:', error.message);
  }
}

ghiJsonObjectVaoFile();

JSON.stringify(cauHinh, null, 2): Dùng để chuyển đối tượng JavaScript thành chuỗi JSON. Tham số null, 2 giúp format JSON đẹp hơn với 2 khoảng trắng thụt đầu dòng, dễ đọc hơn khi mở file.

Illustration

3. Mẹo (Best Practices) từ "lão làng" Creyt

  • Luôn awaittry...catch: Nhắc lại lần nữa: Đừng bao giờ quên! Ghi file là một tác vụ I/O (Input/Output), nó phụ thuộc vào ổ cứng, hệ điều hành, quyền hạn... nên rất dễ "fail". await đảm bảo bạn biết khi nào tác vụ xong, try...catch giúp bạn "sống sót" khi nó "fail". Coi như là "áo giáp" và "bộ đàm" của em vậy.
  • Encoding (Mã hóa): Mặc định writeFile dùng utf8 (UTF-8). Đây là lựa chọn tốt nhất cho hầu hết các trường hợp, đặc biệt là khi các em làm việc với tiếng Việt có dấu. Trừ khi có yêu cầu đặc biệt, cứ để utf8 mà "chiến".
  • Đường dẫn file: Nên dùng path.join từ module path để xây dựng đường dẫn file, đặc biệt khi deploy lên các hệ điều hành khác nhau (Windows dùng \, Linux/macOS dùng /). Điều này giúp code của em "thân thiện" hơn với mọi môi trường.
    import { writeFile } from 'fs/promises';
    import path from 'path';
    
    const tenFileLog = 'app.log';
    const duongDanTuyetDoi = path.join(__dirname, 'logs', tenFileLog);
    // Ghi file vào thư mục 'logs' trong cùng thư mục với file script hiện tại
    await writeFile(duongDanTuyetDoi, 'Nội dung log...');
    
    Lưu ý: __dirname chỉ có trong CommonJS. Với ES Modules, các em dùng import.meta.urlpath.dirname(fileURLToPath(import.meta.url)).
  • writeFile vs writeFileSync: Hiểu rõ sự khác biệt. writeFile (của fs.promises hoặc fs callback) là bất đồng bộ, phù hợp cho mọi ứng dụng cần hiệu suất, không chặn luồng chính. writeFileSync là đồng bộ, nó sẽ "đứng đợi" cho đến khi ghi xong mới làm việc khác. Chỉ dùng writeFileSync cho các script nhỏ, tác vụ khởi tạo mà việc chặn luồng không gây ảnh hưởng lớn, hoặc khi bạn muốn nó chặn.

4. Ứng dụng thực tế: "Xem ai đã xài rồi?"

fs.promises.writeFile() được dùng "nhan nhản" trong các ứng dụng Node.js lớn nhỏ:

  • Hệ thống Log: Ghi lại các sự kiện, lỗi, hoạt động của người dùng vào các file log. Ví dụ: một server web ghi lại mọi request HTTP, lỗi 500, hay các hành động quan trọng của admin.
  • Lưu Cache dữ liệu: Các ứng dụng có thể lưu trữ kết quả của các truy vấn database phức tạp hoặc dữ liệu từ API bên ngoài vào file để lần sau đọc nhanh hơn, giảm tải cho server gốc. Ví dụ: một trang tin tức lưu cache các bài viết hot ra file JSON để load nhanh hơn.
  • Export báo cáo/dữ liệu: Khi người dùng muốn tải xuống một báo cáo dưới dạng CSV, Excel, hoặc JSON. Server sẽ "chế biến" dữ liệu và dùng writeFile để tạo file đó.
  • Quản lý cấu hình: Tự động tạo hoặc cập nhật các file cấu hình .json hay .env cho ứng dụng dựa trên các tham số đầu vào.

5. Thử nghiệm của Creyt & Khi nào nên dùng?

Anh Creyt đã "chinh chiến" với Node.js bao năm, và fs.promises.writeFile() là một người bạn "thân thiết" không thể thiếu. Anh đã dùng nó từ việc ghi hàng triệu dòng log mỗi ngày cho đến việc tạo ra các file dữ liệu khổng lồ để phân tích.

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

  • Xây dựng ứng dụng web/API server: Đây là "kim chỉ nam"! Em không bao giờ muốn server của mình bị "treo" vì một tác vụ ghi file. Bất đồng bộ là chìa khóa để server phản hồi nhanh, xử lý nhiều yêu cầu cùng lúc.
  • Xử lý file có dung lượng lớn: Ghi file vài MB hay vài GB mà không làm "đứng" toàn bộ ứng dụng? writeFile chính là giải pháp.
  • Code sạch sẽ, hiện đại: Với async/await, code của em sẽ dễ đọc, dễ bảo trì hơn rất nhiều so với việc dùng callback "lồng đèn".
  • Khi hiệu suất là ưu tiên hàng đầu: Nếu ứng dụng của em cần hoạt động trơn tru, không gián đoạn, hãy nghĩ ngay đến promises API.

Không nhất thiết phải dùng fs.promises.writeFile() (hoặc có thể dùng writeFileSync) khi:

  • Script tiện ích nhỏ, chạy một lần: Các script chỉ chạy một lần, không yêu cầu độ phản hồi tức thì, việc dùng writeFileSync có thể đơn giản hơn (ít code hơn vì không cần async/awaittry...catch phức tạp).
  • Trong quá trình khởi tạo ứng dụng: Ví dụ, ghi một file cấu hình mặc định chỉ một lần khi ứng dụng vừa khởi động. Việc này thường không ảnh hưởng đến trải nghiệm người dùng.

Nhớ nhé, các em Gen Z! Nắm vững fs.promises.writeFile() là các em đã có thêm một "siêu năng lực" để điều khiển file trong Node.js rồi đấy. Cứ thực hành nhiều vào, có gì thắc mắc cứ "hú" anh Creyt!

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!