fs.writeFileSync(): Ghi Sổ Thần Tốc, Xong Việc Mới Tính!
Nodejs

fs.writeFileSync(): Ghi Sổ Thần Tốc, Xong Việc Mới Tính!

Author

Admin System

@root

Ngày xuất bản

19 Mar, 2026

Lượt xem

3 Lượt

"fs.writeFileSync()"

Alo alo Gen Z code thủ! Hôm nay, Creyt sẽ đưa các bạn đi khám phá một "công cụ" siêu ngầu trong Node.js, đó là fs.writeFileSync(). Nghe tên có vẻ hơi 'hàn lâm' nhưng thực ra nó như một 'thủ thư khó tính' của hệ thống file vậy.

Tưởng tượng bạn đang cần ghi chú một cái gì đó vào cuốn sổ tay ngay lập tức, không chần chừ, không suy nghĩ đến việc khác cho đến khi ghi xong. fs.writeFileSync() chính là cái 'sổ tay thần tốc' đó.

Nó làm gì? Đơn giản là nó giúp bạn 'đổ mực' (ghi dữ liệu) vào một 'tờ giấy' (file) trên máy tính của bạn. Nếu tờ giấy đó chưa có, nó tạo ra. Nếu có rồi, nó sẽ ghi đè lên toàn bộ nội dung cũ. Và quan trọng nhất: nó làm điều đó đồng bộ (synchronously).

1. Code Ví Dụ: Ghi Chú 'Thần Tốc'

Để dễ hình dung, ta có cái ví dụ 'mì ăn liền' sau:

const fs = require('fs');

const filePath = './ghichu.txt';
const data = 'Hôm nay trời đẹp quá, nhớ học code nhé Gen Z!';

try {
  fs.writeFileSync(filePath, data);
  console.log('Ghi file thành công! Check file ghichu.txt đi nào.');
} catch (err) {
  console.error('Ối giời ơi, có lỗi khi ghi file rồi:', err);
}

// Ghi đè file nếu đã tồn tại
const newData = 'Nội dung mới toanh, ghi đè cái cũ luôn!';
try {
  fs.writeFileSync(filePath, newData);
  console.log('Đã ghi đè file ghichu.txt với nội dung mới.');
} catch (err) {
  console.error('Lỗi khi ghi đè file:', err);
}

Và đây là một ví dụ có 'tâm' hơn, kèm theo 'bảo hiểm' lỗi (error handling) và 'tùy chọn' (options) encoding:

const fs = require('fs');

const jsonFilePath = './cau_hinh.json';
const configData = {
  appName: 'GenZ_App',
  version: '1.0.0',
  settings: {
    theme: 'dark',
    notifications: true
  }
};

try {
  // Ghi đối tượng JSON vào file, chuyển thành chuỗi trước
  fs.writeFileSync(jsonFilePath, JSON.stringify(configData, null, 2), {
    encoding: 'utf8',
    mode: 0o666, // Quyền đọc/ghi cho tất cả
    flag: 'w' // 'w' là viết (write), sẽ tạo file nếu không có, ghi đè nếu có
  });
  console.log('Ghi file cấu hình thành công tại:', jsonFilePath);
} catch (err) {
  console.error('Lỗi khi ghi file cấu hình:', err.message);
}

// Ví dụ về ghi file mà không có quyền
const protectedPath = '/root/protected_file.txt'; // Thường cần quyền root
const secretData = 'Đây là dữ liệu siêu bí mật!';

try {
  fs.writeFileSync(protectedPath, secretData);
  console.log('Ghi file bí mật thành công (chắc không đâu)');
} catch (err) {
  console.error(`Không thể ghi vào '${protectedPath}':`, err.message);
  console.error('Lỗi này thường do thiếu quyền truy cập.');
}

2. Creyt's Deep Dive: 'Sync' Là Gì Mà Nguy Hiểm Thế?

Giờ, anh Creyt sẽ 'mổ xẻ' sâu hơn một chút về chữ 'sync' trong writeFileSync.

Trong thế giới lập trình, 'đồng bộ' (synchronous) nghĩa là gì? Nó giống như bạn đang nấu cơm và chỉ có một cái bếp. Bạn phải nấu xong nồi cơm này, bắc ra, rồi mới có thể nấu món canh tiếp theo. Trong thời gian nồi cơm đang sôi, bạn không thể làm gì khác trên cái bếp đó.

Với fs.writeFileSync(), khi bạn gọi nó, Node.js sẽ ngừng tất cả các công việc khác trên luồng chính (main thread) của ứng dụng bạn, đợi cho đến khi việc ghi file hoàn tất thì thôi. Chỉ khi ghi xong, nó mới 'thở phào' và cho phép các tác vụ khác chạy tiếp.

Ưu điểm của sự 'khó tính' này:

Gợi Ý Đọc Tiếp
Module Object Node.js: 'Kho Báu' Code Bạn Nên Biết

3 Lượt xem

  • Đơn giản, dễ hiểu: Code chạy theo thứ tự bạn mong muốn, không cần lo nghĩ về callback hay async/await. Cứ gọi là nó làm, xong rồi mới đến dòng tiếp theo.
  • An toàn trong kịch bản nhất định: Đảm bảo rằng file đã được ghi xong hoàn toàn trước khi code tiếp theo thực thi. Rất hữu ích cho việc ghi cấu hình hoặc các script nhỏ cần tính tuần tự cao.

Nhược điểm (và tại sao nó lại 'nguy hiểm'):

  • Block luồng chính (Main Thread Blocking): Đây là 'tử huyệt' của nó khi dùng trong môi trường server hiệu năng cao. Nếu bạn ghi một file lớn, ứng dụng của bạn sẽ 'đứng hình' trong thời gian đó, không thể xử lý các yêu cầu khác từ người dùng. Tưởng tượng một nhà hàng đang phục vụ khách, tự nhiên đầu bếp dừng hết mọi việc để... ghi công thức vào sổ! Khách sẽ 'bỏ chạy' hết.
  • Không phù hợp với I/O nặng: Tránh xa khi cần ghi hàng loạt file, file lớn, hoặc trong các ứng dụng web cần phản hồi nhanh. Nó sẽ làm 'tắc nghẽn giao thông' và làm chậm ứng dụng của bạn đáng kể.
Illustration

3. Mẹo Hay từ Creyt (Best Practices)

Để dùng writeFileSync không 'gây họa', anh Creyt có vài 'mẹo vặt' sau:

  1. Luôn dùng try...catch: writeFileSync sẽ 'nổi cáu' (throw error) nếu có vấn đề (ví dụ: không có quyền ghi, đường dẫn sai). Hãy 'dỗ ngọt' nó bằng cách bọc trong try...catch để ứng dụng không 'sập nguồn' đột ngột.
  2. Cẩn thận với overwrite: Nhớ nhé, nó ghi đè! Nếu bạn muốn thêm nội dung vào cuối file mà không mất dữ liệu cũ, hãy dùng fs.appendFileSync() (hoặc fs.appendFile() cho async).
  3. Biết rõ khi nào nên dùng: Chỉ nên dùng cho các tác vụ ghi file nhỏ, không thường xuyên, hoặc trong các script độc lập mà việc blocking không ảnh hưởng đến trải nghiệm người dùng hoặc hiệu năng hệ thống.
  4. Suy nghĩ về encoding: Luôn chỉ định encoding (mặc định là utf8) để tránh các vấn đề về hiển thị ký tự đặc biệt, đặc biệt là với tiếng Việt.
  5. Khi nào thì 'say goodbye' với sync? Khi bạn xây dựng các ứng dụng web server, API cần xử lý nhiều yêu cầu đồng thời, hãy quay sang dùng fs.writeFile() (phiên bản bất đồng bộ) hoặc fs.promises.writeFile() để không làm 'tắc nghẽn giao thông' trên server.

4. Ứng Dụng Thực Tế: 'Thủ Thư Khó Tính' Làm Được Gì?

Vậy thì, 'thủ thư khó tính' này được dùng ở đâu trong thế giới thực?

  • Ghi file cấu hình (Configuration files): Khi một ứng dụng cần lưu lại cài đặt người dùng hoặc cấu hình hệ thống sau khi thay đổi (ví dụ: config.json). Vì việc này không xảy ra thường xuyên và cần đảm bảo ghi xong trước khi ứng dụng tiếp tục, writeFileSync là lựa chọn tốt.
  • Ghi log đơn giản trong script: Các script chạy một lần, hoặc các tác vụ cron job cần ghi lại kết quả hoặc lỗi vào một file log nhỏ.
  • Tạo file tạm thời: Khi cần tạo một file nhỏ để lưu trữ dữ liệu tạm thời trong quá trình xử lý của một script.
  • Build tools/CLI tools: Các công cụ dòng lệnh thường dùng writeFileSync để tạo hoặc sửa đổi file trong quá trình build dự án (ví dụ: tạo file index.html động, ghi file package.json sau khi cài đặt dependency).

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

Creyt đã từng 'chinh chiến' với writeFileSync và rút ra vài kinh nghiệm xương máu:

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

  • Bạn đang viết một script Node.js chạy một lần để tự động hóa một tác vụ (ví dụ: đổi tên hàng loạt file, tạo báo cáo, nén ảnh).
  • Bạn cần cập nhật một file .env hoặc config.json sau khi người dùng thay đổi cài đặt và muốn đảm bảo nó được ghi xong trước khi ứng dụng khởi động lại hoặc tiếp tục. Đây là lúc tính đồng bộ của nó trở thành ưu điểm.
  • Trong các bài tập lập trình cơ bản, khi bạn muốn đơn giản hóa việc ghi file mà không cần quan tâm đến async/await phức tạp.

Không nên dùng fs.writeFileSync() (và hãy dùng fs.writeFile hoặc fs.promises.writeFile) khi:

  • Bạn đang xây dựng một Node.js web server (như Express, Koa) và cần ghi dữ liệu từ các yêu cầu của người dùng (ví dụ: upload file, lưu dữ liệu biểu mẫu, ghi log cho mỗi request).
  • Bạn cần ghi một lượng lớn dữ liệu hoặc ghi vào nhiều file cùng lúc. Việc này sẽ gây 'treo' server của bạn.
  • Ứng dụng của bạn yêu cầu phản hồi nhanh và không được phép bị 'đứng hình' dù chỉ một mili giây. Trong trường hợp này, việc 'ghi sổ thần tốc' có thể trở thành 'thần tốc gây sập nguồn' đấy!

Nhớ nhé Gen Z, mỗi công cụ đều có công dụng riêng. Hiểu rõ bản chất của fs.writeFileSync() sẽ giúp bạn trở thành một 'code thủ' thông thái, biết khi nào nên dùng 'súng' và khi nào nên dùng 'dao'!

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!