fs.readFile(): Đọc file thần tốc như shipper GenZ
Nodejs

fs.readFile(): Đọc file thần tốc như shipper GenZ

Author

Admin System

@root

Ngày xuất bản

19 Mar, 2026

Lượt xem

4 Lượt

fs.readFile(): Đọc file thần tốc như shipper GenZ

Chào các chiến thần code GenZ! Hôm nay, anh Creyt sẽ cùng các em "đào sâu" một công cụ cực kỳ quyền năng trong Node.js, đó là fs.readFile(). Nghe tên thì có vẻ khô khan, nhưng tin anh đi, nó thú vị và quan trọng không kém gì việc bạn lướt TikTok tìm trend mới mỗi ngày đâu!

1. fs.readFile() là gì mà ghê vậy?

Trong thế giới lập trình, đôi khi chúng ta cần tương tác với ổ cứng, như đọc một file config, một trang HTML, hay một file log nào đó. Lúc này, fs.readFile() chính là "thằng shipper Grab" đắc lực của bạn.

Cụ thể: fs.readFile() là một hàm trong module fs (File System) của Node.js, dùng để đọc toàn bộ nội dung của một file một cách bất đồng bộ (asynchronously). "Bất đồng bộ" ở đây nghĩa là gì? Nghĩa là khi bạn yêu cầu nó đọc file, nó sẽ không đứng đó chờ cho đến khi đọc xong mới làm việc khác. Thay vào đó, nó sẽ "cử" một tiến trình khác đi đọc file, còn chương trình chính của bạn thì cứ tiếp tục chạy các tác vụ khác. Khi nào đọc xong, nó sẽ "gọi điện báo" cho bạn (thông qua một hàm callback hoặc Promise).

Để làm gì? Đơn giản là để lấy nội dung của file đó và sử dụng trong ứng dụng của bạn. Ví dụ: bạn muốn đọc file settings.json để cấu hình ứng dụng, hay đọc index.html để trả về cho trình duyệt khi có request đến.

Phép ẩn dụ của Creyt: Tưởng tượng bạn đang ngồi làm bài tập và cần một cuốn sách từ thư viện. Nếu bạn tự chạy đến thư viện, tìm sách, rồi mang về (đồng bộ), thì trong lúc bạn đi, bạn không thể làm gì khác. Nhưng nếu bạn gọi một "thằng shipper" (bất đồng bộ), bạn chỉ cần nói tên sách và địa chỉ. Trong lúc shipper đi lấy, bạn vẫn có thể làm tiếp bài tập. Khi nào shipper mang sách đến, nó sẽ gõ cửa (callback) và đưa sách cho bạn. fs.readFile() chính là thằng shipper đó!

2. Code Ví Dụ Minh Hoạ Rõ Ràng

Để sử dụng fs.readFile(), trước tiên chúng ta cần "nhập khẩu" module fs.

Bước 1: Tạo một file mẫu.

Giả sử bạn có một file tên là hello.txt với nội dung:

Xin chào các bạn GenZ!
Đây là nội dung từ file hello.txt.

Bước 2: Viết code Node.js để đọc file.

Đây là cách truyền thống dùng callback:

const fs = require('fs'); // Nhập khẩu module 'fs'

const filePath = './hello.txt'; // Đường dẫn tới file cần đọc

console.log('Bắt đầu đọc file...');

fs.readFile(filePath, 'utf8', (err, data) => {
  // 'utf8' là encoding, nói cho Node biết cách đọc ký tự trong file
  // (err, data) là callback function: err nếu có lỗi, data là nội dung file

  if (err) {
    // Nếu có lỗi, in ra lỗi và dừng lại
    console.error('Đọc file lỗi rồi, sếp ơi:', err);
    return;
  }

  // Nếu không có lỗi, in ra nội dung file
  console.log('Đọc file thành công!');
  console.log('Nội dung file:', data);
});

console.log('Tiếp tục làm việc khác trong lúc chờ đọc file...');
// Dòng này sẽ chạy ngay lập tức, không chờ readFile xong.

Output khi chạy:

Bắt đầu đọc file...
Tiếp tục làm việc khác trong lúc chờ đọc file...
Đọc file thành công!
Nội dung file: Xin chào các bạn GenZ!
Đây là nội dung từ file hello.txt.

Các em thấy không? Dòng "Tiếp tục làm việc khác..." chạy trước cả khi file được đọc xong. Đó chính là sức mạnh của bất đồng bộ!

Code hiện đại hơn với async/await (nên dùng):

Node.js từ phiên bản 10 trở lên đã có fs.promises giúp chúng ta dùng async/await với các hàm của fs, làm code sạch sẽ và dễ đọc hơn rất nhiều, tránh "callback hell".

const { readFile } = require('fs').promises; // Lấy hàm readFile từ fs.promises

async function docFileGenZ() {
  const filePath = './hello.txt';

  console.log('Bắt đầu đọc file với async/await...');

  try {
    const data = await readFile(filePath, 'utf8'); // Dùng await để chờ kết quả
    console.log('Đọc file thành công với async/await!');
    console.log('Nội dung file:', data);
  } catch (err) {
    console.error('Đọc file lỗi rồi, sếp ơi (async/await):', err);
  }

  console.log('Hoàn tất tác vụ đọc file.');
}

docFileGenZ();
console.log('Vẫn tiếp tục làm việc khác trong lúc chờ async function chạy...');
// Dòng này vẫn chạy ngay lập tức, vì async function bản thân nó cũng bất đồng bộ.

3. Mẹo (Best Practices) từ Creyt để code mượt mà

  • Luôn luôn xử lý lỗi: Như ví dụ trên, tham số err trong callback hay try...catch với async/await là bắt buộc. File có thể không tồn tại, không có quyền truy cập, hoặc bị hỏng. Đừng bao giờ bỏ qua nó!
  • Chỉ định Encoding: Luôn cung cấp encoding (như 'utf8') để đảm bảo nội dung file được đọc đúng cách, đặc biệt với tiếng Việt có dấu. Nếu không chỉ định, data sẽ trả về một Buffer (dãy byte), bạn sẽ phải tự toString() nó.
  • fs.readFileSync() - Khi nào dùng? Có một "người anh em" của readFilereadFileSync (có chữ Sync – Synchronous). Nó đọc file một cách đồng bộ, tức là chương trình sẽ đứng chờ cho đến khi đọc xong mới làm việc tiếp. Chỉ nên dùng nó cho các script nhỏ, đơn giản, hoặc khi bạn biết chắc rằng việc đọc file sẽ không làm tắc nghẽn ứng dụng (ví dụ: đọc file config khi khởi động ứng dụng, không phải trong request của người dùng). Tuyệt đối tránh dùng readFileSync trong các server xử lý request, vì nó sẽ làm treo server của bạn!
  • Dùng fs.promises.readFile với async/await: Như anh đã nói, đây là cách viết code hiện đại, dễ đọc, dễ bảo trì và tránh "callback hell" – một nỗi ám ảnh của các lập trình viên Node.js đời đầu.

4. Ứng dụng thực tế: fs.readFile() "làm được gì"?

  • Đọc file cấu hình (config files): Các ứng dụng web thường có file config.json hoặc .env để lưu trữ cài đặt database, port, API keys... fs.readFile() là công cụ lý tưởng để tải những cài đặt này khi ứng dụng khởi động.
  • Phục vụ file tĩnh (Static Files): Một web server cơ bản có thể dùng fs.readFile() để đọc các file HTML, CSS, JavaScript, hình ảnh và trả về cho trình duyệt khi có yêu cầu.
  • Xử lý file dữ liệu: Đọc các file CSV, JSON lớn để phân tích dữ liệu, hoặc đọc các file log để debug.
  • Xây dựng API trả về nội dung file: Ví dụ, một API có thể trả về nội dung của một file PDF hoặc một đoạn mã nguồn khi người dùng yêu cầu.

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

Anh Creyt đã từng "sống chết" với fs.readFile() từ những ngày đầu Node.js còn non trẻ. Hồi đó, callback hell là một nỗi ám ảnh kinh hoàng. Code cứ lồng vào nhau như mấy cái tổ chim, nhìn vào là muốn "rụng tim". May mà giờ có async/await rồi, cuộc đời tươi sáng hơn hẳn!

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

  • Bạn cần đọc toàn bộ nội dung của một file nhỏ đến vừa. (Nếu file quá lớn, hãy xem xét fs.createReadStream() để đọc từng phần, tránh tốn RAM).
  • Bạn đang xây dựng một web server và cần phục vụ các file tĩnh (HTML, CSS, JS) cho trình duyệt.
  • Bạn cần đọc file cấu hình, file dữ liệu không quá lớn trong các ứng dụng backend.
  • Bạn muốn tận dụng tính chất bất đồng bộ của Node.js để ứng dụng không bị "đứng hình" trong lúc chờ đọc file.

Thử nghiệm của Creyt: Anh từng có một dự án phải đọc hàng trăm file log nhỏ cùng lúc để tổng hợp báo cáo. Ban đầu dùng readFileSync và kết quả là server "đứng hình" vài giây mỗi khi có yêu cầu báo cáo. Chuyển sang fs.readFile với Promise.all (để chạy song song nhiều tác vụ đọc file bất đồng bộ) thì mọi thứ mượt mà như bơ, không còn độ trễ đáng kể nào nữa.

Vậy đó, fs.readFile() không chỉ là một hàm đọc file khô khan mà là một công cụ cực kỳ linh hoạt và mạnh mẽ trong Node.js. Nắm vững nó, các em sẽ có thêm một "siêu năng lực" để xây dựng những ứng dụng "đỉnh của chóp" đấy! Cứ thực hành nhiều vào nhé, có gì khó cứ hỏi 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!