File System

Sử dụng module fs trong Node.js giúp chúng ta có thể dễ dàng làm việc với hệ thống tập tin trên máy tính (hoặc máy chủ). Trong phần này chúng ta sẽ học cách viết nội dung lên tập tin và đọc nội dung từ tập tin theo 2 cách khác nhau là đồng bộ (synchronous) và bất đồng bộ (asynchronous).

Ghi Dữ Liệu

Khi ghi dữ liệu lên tập tin chúng ta cần cung cấp tên của tập tin (bao gồm đường dẫn thư mục và tên tập tin) và dữ liệu sẽ ghi lên tập tin đó. Nếu tập tin không tồn tại thì Node.js sẽ tạp ra một tập tin mới. Ngược lại, Node.js sẽ ghi đè lên tập tin có sẵn.

Ghi Đồng Bộ

Dưới đây là một ví dụ về ghi đồng bộ dữ liệu lên trên tập tin. Tạo một file write_sync.js với nội dung như sau:

var fs = require('fs');
var result = fs.writeFileSync('Xin chào', 'message.txt', 'utf-8');
console.log('Done');
console.log('Bye');

Khi chạy file trên và kiểm tra trên thư mục chứa nó bạn sẽ thấy có một file mới với tên gọi message.txt được tạo ra với dòng chữ Xin Chào trong đó. Ngoài ra bạn cũng sẽ thấy trên màn hình Command Prompt dòng thông báo như dưới đây:

NodeJS ghi dữ liệu đồng bộ

Hamfs.writeFileSync luôn trả về giá trị là undefined ngay cả khi xuất hiện lỗi trong quá trình viết lên file (ví dụ như khi bạn gõ sai địa chỉ thư mục hoặc dữ liệu quá lớn khiến tràn bộ nhớ..)

Ghi Không Đồng Bộ

Trong cách ghi dữ liệu này, quá trình ghi dữ liệu sẽ được thực thi mà không cản trở việc các câu lệnh sau đó tiếp tục được thực thi.

var fs = require('fs');
fs.writeFile('message.txt', 'Xin chào', function (err) {
  if (err) throw err;
  console.log('Done!');
});
console.log('Bye');

Với cách ghi này, bạn sẽ cần truyền vào method writeFile 2 đối số. Đối số đầu là tên file, đối số thứ 2 là nội dung sẽ được ghi lên file và đối số thứ 3 là hàm callback, hàm này được gọi khi quá trình viết dữ liệu hoàn tất.

Dưới đây là kết quả khi thực thi chương trình trên:

NodeJS Ghi Dữ Liệu Không Đồng Bộ

Đọc Dữ Liệu

Node.js cung cấp cho chúng ta hai phương pháp khác nhau để có thể đọc dữ liệu từ một file đó là đọc đồng bộ (synchronous) và đọc không đồng bộ (asynchronous). Trong bài viết này chúng ta sẽ tìm hiểu lần lượt từng phương pháp thông qua đó hiểu được sự khác biệt trong giữa chúng.

Để có thể chạy được các đoạn mã ví dụ trong bài viết thì trước hết bạn cần tạo một file text.txt với nội dung sau:

Dòng 1
Dòng 2
Dòng 3

Và lưu file này trên máy ở địac chỉ thư mục C:\nodejs\.

Đọc Đồng Bộ

Đọc dữ liệu theo phương pháp đồng bộ là phương pháp đọc mà trong đó Node.sj sẽ chỉ tiếp tục chạy chương trình sau khi kết thúc quá trình đọc. Nói cách khác luồng chạy của chương trình chỉ có thể được tiếp tục sau khi Node.js kết thúc việc đọc dữ liệu. Để hiểu cụ thể về cách đọc này thì bây giờ bạn hãy tạo một file read_syn.js với nội dung sau:

var fs = require('fs');
var content = fs.readFileSync('C:\nodejs\text.txt', 'utf-8');
console.log(content);
console.log('Bye');

Ở đoạn mã trên chúng ta sử dụng hàm require để load (nạp vào) thư viện fs (viết tắt của File System). Thư viện này trả về một object có chứa nhiều method khacs nhau giúp tương tác với file trên hệ thống. Ở đây chúng ta sử dụng method readFileSync để đọc nội dung file text.txt. Khi sử dụng phương thức này bạn cần truyền vào đối số đầu tiên là đường dẫn của file mà bạn cần đọc nội dung và đối số thứ hai (tùy ý) để xác định bộ ký tự mã hóa dùng khi lưu file trên máy, ở đây chúng ta chọn bộ ký tự mã hóa file là UTF-8.

Lưu ý: Nếu file read_asyn.js ở cùng với thư mục chứa thư mục text.txt thì khi gọi method readFile của fs bạn có thể thay đổi đường dẫn tuyệt đối C:\nodejs\text.txt thành đại chỉ tương đối .\text.txt.

Khi chạy đoạn code trên, bạn sẽ thấy kết quả như sau:

Node.js Đọc File Đồng Bộ

Ở trên, bạn thấy chương trình hiển thị hết toàn bộ nội dung của file đang đọc rồi sau đó mới hiển thị dòng chữ Bye. Và cách đọc nội dung như trên được gọi là đọc đồng bộ. Node.js sẽ chỉ thực thi mã lệnh tiếp theo sau khi việc đọc nội dung file đã hoàn tất.

Đọc Không Đồng Bộ

Bây giờ chúng ta cũng nhau tìm hiểu phương thức thứ 2 để đọc nội dung file. Với phương thức này thì quá trình thực thi chương trình của Node.js sẽ thay đổi. Quá trình đọc nội dung file sẽ không cản trở việc thực thi chương trình, các đoạn mã phía sau sẽ vẫn được thực thi cùng lúc với việc đọc nội dung file.

Bây giờ hãy tạo một fiel read_asyn.js với nội dung như sau:

fs = require('fs');
fs.readFile('./text.txt', 'utf-8', function (err, data) {
    console.log(data);
});
console.log('Bye');

Ở đây chúng ta sử dụng một phương thức khác của đối tượng fs đó là readFile. Phương thứcc này được định nghĩa với 3 tham số đầu vào. Tham số đầu dùng để xác định tên file cần đọc nội dung từ đó. Tham số thứ hai là không bắt buộc và bạn có thể tùy ý bỏ đi. Tham số này dùng để xác định bộ ký tự của file được đọc. Tham số thứ ba là một hàm chứa với hai tham số là errdata. Hàm này được gọi là hàm callback (hay hàm gọi ngược lại). Sở dĩ có tên như vậy là do hàm callback không được thực thi ngay khi tiến trình đọc dữ liệu của file được bắt đầu mà chỉ được gọi khi sau khi quá trình đọc dữ liệu này kết thúc.

Cuối cùng, chạy chương trình trên sử dụng chương trình Windows Command Prompt bạn sẽ có được kết quả tương tự như phía dưới:

Node.js Đọc File Không Đồng Bộ

Ở đây bạn để ý thấy dòng chữ Bye được hiển thị trước nội dung của file text.txt. Điều này là do việc đọc nội dung file không gây gián đoạn các đoạn mã phía sau được thực thi.

Như vậy tới đây bạn đã được làm quen với việc đọc dữ liệu trên file sử dụng hai phương thức khác nhau là đọc đồng bộ và đọc không đồng bộ có trong Node.js.

Node.js
Thêm Bình Luận: