Node js Streams Tutorial: Filestream, Pipes

Trong hướng dẫn này, bạn sẽ học

  • Filestream trong Node.js
  • Pipes trong Node.js
  • Sự kiện trong Node.js
  • Sự kiện phát ra

Filestream trong Node.js

Node sử dụng rộng rãi các luồng làm cơ chế truyền dữ liệu.

Ví dụ: khi bạn xuất bất kỳ thứ gì ra bảng điều khiển bằng cách sử dụng hàm console.log, bạn thực sự đang sử dụng một luồng để gửi dữ liệu đến bảng điều khiển.

Node.js cũng có khả năng truyền dữ liệu từ các tệp để chúng có thể được đọc và ghi một cách thích hợp. Bây giờ chúng ta sẽ xem xét một ví dụ về cách chúng ta có thể sử dụng các luồng để đọc và ghi từ các tệp. Chúng tôi cần làm theo các bước được đề cập bên dưới cho ví dụ này

Bước 1) Tạo một tệp có tên data.txt có dữ liệu bên dưới. Giả sử tệp này được lưu trữ trên ổ đĩa D của máy cục bộ của chúng tôi.

Hướng dẫn về Node.js

Giới thiệu

Sự kiện

Máy phát điện

Kết nối dữ liệu

Sử dụng hoa nhài

Bước 2) Viết mã liên quan sẽ sử dụng các luồng để đọc dữ liệu từ tệp.

var fs = require("fs");var stream;stream = fs.createReadStream("D://data.txt");stream.on("data", function(data) {var chunk = data.toString();console.log(chunk);});

Giải thích mã: -

  1. Trước tiên, chúng ta cần bao gồm các mô-đun 'fs' chứa tất cả các chức năng cần thiết để tạo luồng.
  2. Tiếp theo, chúng ta tạo một luồng có thể đọc được bằng cách sử dụng phương thức - createReadStream. Như một đầu vào, chúng tôi cung cấp vị trí của tệp data.txt của chúng tôi.
  3. Hàm steam.on là một trình xử lý sự kiện và trong đó, chúng tôi đang chỉ định tham số đầu tiên là 'dữ liệu.' Điều này có nghĩa là bất cứ khi nào dữ liệu đến trong luồng từ tệp, sau đó thực hiện một hàm gọi lại. Trong trường hợp của chúng tôi, chúng tôi đang xác định một hàm gọi lại sẽ thực hiện 2 bước cơ bản. Đầu tiên là chuyển đổi dữ liệu đọc từ tệp dưới dạng chuỗi. Thứ hai là gửi chuỗi đã chuyển đổi dưới dạng đầu ra tới bảng điều khiển.
  4. Chúng tôi đang lấy từng đoạn dữ liệu được đọc từ luồng dữ liệu và chuyển đổi nó thành một chuỗi.
  5. Cuối cùng, chúng tôi đang gửi đầu ra của từng đoạn chuỗi được chuyển đổi sang bảng điều khiển.

Đầu ra:

  • Nếu mã được thực thi đúng cách, bạn sẽ thấy kết quả ở trên trong bảng điều khiển. Đầu ra này sẽ giống như trong tệp data.txt.

Ghi vào một tệp

Theo cách tương tự, chúng ta tạo luồng đọc, chúng ta cũng có thể tạo luồng ghi để ghi dữ liệu vào tệp. Đầu tiên, hãy tạo một tệp trống không có nội dung được gọi là data.txt. Giả sử tệp này được đặt trong ổ đĩa D của máy tính của chúng ta.

Đoạn mã dưới đây cho thấy cách chúng tôi có thể ghi dữ liệu vào tệp.

var fs = require("fs");var stream;stream = fs.createWriteStream("D://data.txt");stream.write("Tutorial on Node.js")stream.write("Introduction")stream.write("Events")stream.write("Generators")stream.write("Data Connectivity")stream.write("Using Jasmine")

Giải thích mã: -

  1. Chúng tôi đang tạo một luồng có thể ghi bằng cách sử dụng phương thức - createWriteStream. Như một đầu vào, chúng tôi cung cấp vị trí của tệp data.txt của chúng tôi.
  2. Tiếp theo, chúng tôi sử dụng phương thức stream.write để ghi các dòng văn bản khác nhau vào tệp văn bản của chúng tôi. Luồng sẽ đảm nhận việc ghi dữ liệu này vào tệp data.txt.

Nếu bạn mở tệp data.txt, bây giờ bạn sẽ thấy dữ liệu sau trong tệp

Hướng dẫn về Node.js

Giới thiệu

Sự kiện

Máy phát điện

Kết nối dữ liệu

Sử dụng hoa nhài

Pipes trong Node.js

Trong các ứng dụng Node, các luồng có thể được nối với nhau bằng cách sử dụng phương thức pipe (), có hai đối số:

  • Luồng có thể ghi bắt buộc hoạt động như đích cho dữ liệu và
  • Một đối tượng tùy chọn được sử dụng để chuyển các tùy chọn.

Một ví dụ điển hình của việc sử dụng đường ống, nếu bạn muốn truyền dữ liệu từ tệp này sang tệp khác.

Vì vậy, chúng ta hãy xem một ví dụ về cách chúng ta có thể chuyển dữ liệu từ tệp này sang tệp khác bằng cách sử dụng đường ống.

Bước 1) Tạo một tệp có tên là datainput.txt có dữ liệu bên dưới. Giả sử tệp này được lưu trữ trên ổ đĩa D của máy cục bộ của chúng tôi.

Hướng dẫn về Node.js

Giới thiệu

Sự kiện

Máy phát điện

Kết nối dữ liệu

Sử dụng hoa nhài

Bước 2) Tạo một tệp trống trống có tên dataOutput.txt và đặt nó vào ổ đĩa D của máy cục bộ của bạn.

Bước 3) Viết đoạn mã dưới đây để thực hiện chuyển dữ liệu từ tệp datainput.txt sang tệp dataOutput.txt.

var fs = require("fs");var readStream = fs.createReadStream("D://datainput.txt");var writeStream = fs.createWriteStream("D://dataOutput.txt");readStream.pipe(writeStream);

Giải thích mã: -

  1. Trước tiên, chúng tôi đang tạo một "luồng đọc" cho tệp datainput.txt chứa tất cả dữ liệu của chúng tôi cần được chuyển sang tệp mới.
  2. Sau đó, chúng ta cần tạo một "dòng ghi" vào tệp dataOutput.txt, là tệp trống của chúng ta và là đích để chuyển dữ liệu từ tệp datainput.txt.
  3. Sau đó, chúng tôi sử dụng lệnh pipe để chuyển dữ liệu từ luồng đọc sang luồng ghi. Lệnh pipe sẽ lấy tất cả dữ liệu đi vào dòng đọc và đẩy nó vào dòng ghi.

Nếu bây giờ bạn mở tệp dataOutput.txt, bạn sẽ thấy tất cả dữ liệu có trong tệp datainput.txt.

Sự kiện trong Node.js

Sự kiện là một trong những khái niệm quan trọng trong Node.js và đôi khi Node.js được gọi là một khung hướng sự kiện.

Về cơ bản, một sự kiện là một cái gì đó xảy ra. Ví dụ: nếu một kết nối được thiết lập với cơ sở dữ liệu, thì sự kiện kết nối cơ sở dữ liệu sẽ được kích hoạt. Lập trình theo hướng sự kiện là tạo các hàm sẽ được kích hoạt khi các sự kiện cụ thể được kích hoạt.

Hãy xem một ví dụ cơ bản về việc xác định một sự kiện trong Node.js.

Chúng tôi sẽ tạo một sự kiện có tên là 'data_renition'. Khi sự kiện này được kích hoạt, văn bản "dữ liệu đã nhận" sẽ được gửi đến bảng điều khiển.

var events = require('events');var eventEmitter = new events.EventEmitter();eventEmitter.on('data_received', function() {console.log('data received succesfully.');});eventEmitter.emit('data_received');

Giải thích mã: -

  1. Sử dụng hàm yêu cầu để bao gồm mô-đun 'sự kiện'. Với mô-đun này, bạn sẽ có thể tạo các sự kiện trong Node.js.
  2. Tạo một trình phát sự kiện mới. Điều này được sử dụng để liên kết sự kiện, trong trường hợp của chúng tôi là "data_renition" với một hàm gọi lại được xác định trong bước 3.
  3. Chúng tôi xác định một hàm hướng sự kiện cho biết rằng nếu trong trường hợp sự kiện "data_renition" được kích hoạt thì chúng ta nên xuất văn bản "data_renition" ra bảng điều khiển.
  4. Cuối cùng, chúng tôi có một trình kích hoạt thủ công cho sự kiện của chúng tôi bằng cách sử dụng hàm eventEmiter.emit. Điều này sẽ kích hoạt sự kiện data_renition.

Khi chương trình được chạy, văn bản "dữ liệu nhận được" sẽ được gửi đến bảng điều khiển như hình dưới đây.

Sự kiện phát ra

Khi xác định sự kiện, có các phương thức khác nhau cho các sự kiện có thể được gọi. Chủ đề này tập trung vào việc xem xét từng chi tiết một trong số chúng.

  1. Trình xử lý sự kiện một lần

Đôi khi bạn có thể quan tâm đến việc phản ứng với một sự kiện chỉ trong lần đầu tiên nó xảy ra. Trong những tình huống này, bạn có thể sử dụng phương thức once ().

Hãy xem cách chúng ta có thể sử dụng phương thức một lần cho các trình xử lý sự kiện.

Giải thích mã: -

  1. Ở đây chúng tôi đang sử dụng phương thức 'một lần' để nói rằng đối với sự kiện 'data_renition', hàm gọi lại chỉ nên được thực thi một lần.
  2. Ở đây, chúng tôi đang kích hoạt sự kiện 'data_renition' theo cách thủ công.
  3. Khi sự kiện 'data_renition' được kích hoạt trở lại, lần này, sẽ không có gì xảy ra. Điều này là do bước đầu tiên mà chúng tôi đã nói rằng sự kiện chỉ có thể được kích hoạt một lần.

Nếu mã được thực thi đúng cách, kết quả đầu ra trong nhật ký sẽ là 'dữ liệu được nhận thành công'. Thông báo này sẽ chỉ xuất hiện một lần trong bảng điều khiển.

  1. Kiểm tra người nghe sự kiện

Tại bất kỳ thời điểm nào trong thời gian tồn tại của nó, trình phát sự kiện có thể không có hoặc nhiều người nghe gắn liền với nó. Người nghe cho từng loại sự kiện có thể được kiểm tra theo một số cách.

Nếu bạn chỉ quan tâm đến việc xác định số lượng người nghe đính kèm, thì không cần tìm đâu xa hơn phương thức EventEmitter.listenerCount ().

( Lưu ý: Người nghe rất quan trọng vì chương trình chính phải biết liệu người nghe có đang được thêm nhanh vào một sự kiện hay không, nếu không chương trình sẽ hoạt động sai vì người nghe bổ sung sẽ được gọi.)

Giải thích mã: -

  1. Chúng tôi đang xác định một loại eventEmitter cần thiết để sử dụng các phương thức liên quan đến sự kiện.
  2. Sau đó, chúng tôi đang xác định một đối tượng được gọi là emitter sẽ được sử dụng để xác định các trình xử lý sự kiện của chúng tôi.
  3. Chúng tôi đang tạo 2 trình xử lý sự kiện về cơ bản không làm gì cả. Điều này được giữ đơn giản cho ví dụ của chúng tôi chỉ để hiển thị cách thức hoạt động của phương thức ListeningCount.
  4. Bây giờ khi bạn gọi phương thức listeningCount trên sự kiện data_receive của chúng tôi, nó sẽ gửi số lượng trình nghe sự kiện được đính kèm với sự kiện này trong nhật ký bảng điều khiển.

Nếu mã được thực thi đúng cách, giá trị của 2 sẽ được hiển thị trong nhật ký bảng điều khiển.

  1. Sự kiện mới

Mỗi khi một trình xử lý sự kiện mới được đăng ký, trình phát sự kiện sẽ phát ra một sự kiện Trình xử lý sự kiện mới. Sự kiện này được sử dụng để phát hiện các trình xử lý sự kiện mới. Bạn thường sử dụng sự kiện newListener khi bạn cần phân bổ tài nguyên hoặc thực hiện một số hành động cho mỗi trình xử lý sự kiện mới.

var events = require('events');var eventEmitter = events.EventEmitter;var emitter = new eventEmitter();emitter.on("newListener", function(eventName, listener) {console.log("Added listener for " + eventName + " events");});emitter.on('data_received', function() {});emitter.on('data_received', function() {});

Giải thích mã: -

  1. Chúng tôi đang tạo một trình xử lý sự kiện mới cho sự kiện 'newListener'. Vì vậy, bất cứ khi nào một trình xử lý sự kiện mới được đăng ký, văn bản "Đã thêm trình xử lý cho" + tên sự kiện sẽ được hiển thị trong bảng điều khiển.
  2. Ở đây chúng tôi đang ghi vào bảng điều khiển văn bản "Đã thêm trình nghe cho" + tên sự kiện cho mỗi sự kiện đã đăng ký.
  3. Chúng tôi đang xác định 2 trình xử lý sự kiện cho sự kiện 'data_renition' của chúng tôi.

Nếu mã trên được thực thi đúng cách, văn bản dưới đây sẽ được hiển thị trong bảng điều khiển. Nó chỉ cho thấy rằng trình xử lý sự kiện 'newListener' đã được kích hoạt hai lần.

Đã thêm trình nghe cho các sự kiện data_renition

Đã thêm trình nghe cho các sự kiện data_renition

Tóm lược

  • Các luồng được sử dụng trong Node.js để đọc và ghi dữ liệu từ các thiết bị Đầu vào-Đầu ra. Node.js sử dụng thư viện 'fs' để tạo các luồng có thể đọc và ghi vào tệp. Các luồng này có thể được sử dụng để đọc và ghi dữ liệu từ các tệp.
  • Ống có thể được sử dụng để kết nối nhiều luồng với nhau. Một trong những ví dụ phổ biến nhất là gộp luồng đọc và ghi lại với nhau để truyền dữ liệu từ tệp này sang tệp khác.
  • Node.js cũng thường được gắn thẻ là một khung điều khiển sự kiện và rất dễ dàng để xác định các sự kiện trong Node.js. Các chức năng có thể được xác định để đáp ứng các sự kiện này.
  • Sự kiện cũng hiển thị các phương pháp để phản hồi các sự kiện chính. Ví dụ, chúng ta đã thấy trình xử lý sự kiện once () có thể được sử dụng để đảm bảo rằng một hàm gọi lại chỉ được thực thi một lần khi một sự kiện được kích hoạt.

thú vị bài viết...