Trong Node.js, việc đọc và ghi file là một phần không thể thiếu trong quá trình xử lý I/O. Module fs cung cấp các phương thức để thực hiện các thao tác này một cách dễ dàng.

1. Khái niệm đồng bộ vs không đồng bộ trong Node.js

Trước khi đi sâu vào cách đọc và ghi file trong Node.js, chúng ta cần hiểu khái niệm về đồng bộ và không đồng bộ trong ngữ cảnh của Node.js. Mỗi phương thức trong module fs của Node.js đều có hai dạng hoạt động: đồng bộ và không đồng bộ.

Vậy, đồng bộ và không đồng bộ là gì?

  • Đồng bộ (Synchronous): Trong phương pháp đồng bộ, một tác vụ được thực thi theo thứ tự, từ trên xuống dưới. Khi một tác vụ được gọi, chương trình sẽ chờ cho đến khi tác vụ đó hoàn thành trước khi tiếp tục thực hiện các tác vụ khác.
  • Không đồng bộ (Asynchronous): Trong phương pháp không đồng bộ, các tác vụ được thực thi mà không cần chờ đợi kết quả của tác vụ trước. Thay vào đó, chương trình tiếp tục thực hiện các tác vụ khác trong khi các tác vụ không đồng bộ đang được thực thi, và sẽ xử lý kết quả khi chúng hoàn thành.

Sử dụng phương thức không đồng bộ

Việc sử dụng các phương thức không đồng bộ là phổ biến trong Node.js vì tính linh hoạt và hiệu suất cao của chúng. Các phương thức không đồng bộ trong module fs nhận một tham số cuối cùng là một hàm callback, được gọi khi tác vụ hoàn thành, và thường nhận một hàm callback khác để xử lý lỗi.

Ví dụ: Để minh họa cách sử dụng các phương thức không đồng bộ trong Node.js, chúng ta có thể sử dụng phương thức readFile() để đọc nội dung của một file. Dưới đây là một ví dụ:

var fs = require("fs");

// Phương thức đọc file không đồng bộ
fs.readFile('input.txt', function (err, data) {
   if (err) {
       return console.error(err);
   }
   console.log("Nội dung của file (không đồng bộ): " + data.toString());
});

// Phương thức đọc file đồng bộ
var data = fs.readFileSync('input.txt');
console.log("Nội dung của file (đồng bộ): " + data.toString());
console.log("Kết thúc chương trình.");

Trong đoạn mã trên, chúng ta sử dụng phương thức readFile() để đọc nội dung của file input.txt một cách không đồng bộ và readFileSync() để thực hiện cùng một tác vụ một cách đồng bộ.

Kết quả khi chạy chương trình sẽ hiển thị nội dung của file theo cả hai cách thức, nhưng phương thức không đồng bộ sẽ không chờ đợi khi file được đọc xong và tiếp tục thực thi các câu lệnh tiếp theo. Bạn có thể tìm hiểu thêm về đồng bộ trong Node.js tại bài viết Giải thích về Asynchronous trong JavaScript và cách thức hoạt động.

>>>>> Xem thêm bài viết tương tự:

2. Đọc File

Để đọc nội dung của một file, bạn có thể sử dụng phương thức readFile cho việc đọc không đồng bộ, hoặc readFileSync cho việc đọc đồng bộ.

Ví dụ đọc file không đồng bộ:

var fs = require('fs');

fs.readFile('input.txt', function (err, data) {
  if (err) {
    return console.error(err);
  }
  console.log("Nội dung file: " + data.toString());
});

Ví dụ đọc file đồng bộ:

var fs = require('fs');

var data = fs.readFileSync('input.txt');
console.log("Nội dung file: " + data.toString());

3. Ghi File

Khi muốn ghi nội dung vào file, bạn có thể sử dụng writeFile để ghi đè lên file, hoặc appendFile để thêm nội dung vào cuối file.

Ví dụ ghi file:

var fs = require('fs');

fs.writeFile('output.txt', 'Nội dung mới', function (err) {
  if (err) {
    return console.error(err);
  }
  console.log("Ghi file thành công!");
});

Ví dụ thêm nội dung vào file:

var fs = require('fs');

fs.appendFile('output.txt', 'Thêm nội dung', function (err) {
  if (err) {
    return console.error(err);
  }
  console.log("Thêm nội dung thành công!");
});

4. Các Flag sử dụng trong đọc và ghi file trong Node.js

Trong quá trình làm việc với file trong Node.js, chúng ta có thể cần sử dụng các flag để xác định cách mà file sẽ được mở và xử lý. Dưới đây là một số flag phổ biến được sử dụng trong module fs của Node.js:

  • r: Mở file để đọc. Nếu file không tồn tại, sẽ xuất hiện Exception.
  • r+: Mở file để đọc và ghi. Nếu file không tồn tại, sẽ xuất hiện Exception.
  • rs: Mở file để đọc trong chế độ đồng bộ.
  • rs+: Mở file để đọc và ghi, báo cho Hệ điều hành mở nó trong chế độ đồng bộ.
  • w: Mở file để ghi. Nếu file không tồn tại, sẽ tạo file mới.
  • wx: Tương tự w, nhưng hoạt động này thất bại nếu file không tồn tại (không tạo file mới).
  • w+: Mở file để đọc và ghi. Nếu file không tồn tại, sẽ tạo file mới.
  • wx+: Tương tự w+, nhưng hoạt động này thất bại nếu file không tồn tại.
  • a: Mở file để append. File sẽ được tạo nếu nó không tồn tại.
  • ax: Tương tự a, nhưng hoạt động này thất bại nếu file không tồn tại.
  • a+: Mở file để đọc và append. File sẽ được tạo nếu nó không tồn tại.
  • ax+: Tương tự a+, nhưng hoạt động này thất bại nếu file không tồn tại.

Ví dụ:

Dưới đây là một ví dụ minh họa sử dụng flag khi mở file trong Node.js:

const fs = require("fs");

console.log("Chuẩn bị mở file...");

fs.open('input.txt', 'r+', (err, fd) => {
   if (err) {
       return console.error(err);
   }
   
   console.log("File đã mở thành công!");
});

Trong đoạn mã trên, chúng ta sử dụng phương thức open() để mở file input.txt với flag là r+, đồng thời sử dụng một hàm callback để xử lý kết quả của việc mở file. Nếu có lỗi xảy ra trong quá trình mở file, chúng ta sẽ in ra thông báo lỗi.

Kết luận

Node.js cung cấp một loạt các phương thức để làm việc với file một cách linh hoạt. Việc sử dụng các phương thức không đồng bộ giúp tăng hiệu suất của ứng dụng bằng cách không khóa luồng chính khi thực hiện I/O.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy, Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY

Banner bottom