Hướng dẫn về luồng Node js: Filestream, Pipes
Luồng tệp trong Node.js
Nút 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 cứ thứ gì ra bảng điều khiển bằng hàm console.log, thực tế là bạn đ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 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 ta cần làm theo các bước được đề cập dưới đây 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 ổ 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
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ã: -
- Trước tiên, chúng ta cần bao gồm các mô-đun 'fs' chứa tất cả chức năng cần thiết để tạo luồng.
- 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. Là đầu vào, chúng tôi cung cấp vị trí của tệp data.txt của mình.
- Hàm steam.on là một trình xử lý sự kiện và trong đó, chúng ta chỉ định tham số đầu tiên là 'data.' Điều này có nghĩa là bất cứ khi nào dữ liệu đến từ tệp, thì sẽ thực thi chức năng gọi lại. Trong trường hợp của chúng tôi, chúng tôi đang xác định 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. Cách thứ hai là gửi chuỗi đã chuyển đổi dưới dạng đầu ra tới bảng điều khiển.
- 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 chuỗi.
- Cuối cùng, chúng tôi gửi đầu ra của từng đoạn chuỗi được chuyển đổi tới 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ả đầu ra ở trên trong bảng điều khiển. Đầu ra này sẽ giống như đầu ra trong tệp data.txt.
Viết vào một tập tin
Tương tự như cách 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. Trước tiên hãy tạo một tệp trống không có nội dung gọi là data.txt. Giả sử tệp này được đặt trong ổ D của máy tính của chúng tôi.
Đoạn mã dưới đây cho thấy cách chúng ta 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ã: -
- 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. Là đầu vào, chúng tôi cung cấp vị trí của tệp data.txt của mình.
- Tiếp theo, chúng tôi sử dụng phương thức streaming.write để ghi các dòng văn bản khác nhau vào tệp văn bản của mình. Luồng sẽ đảm nhiệm 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
Generators
Kết nối dữ liệu
Sử dụng Jasmine
Ống trong Node.js
Trong các ứng dụng Node, các luồng có thể được kết hợp với nhau bằng phương thức pipe(), phương thức này có hai đối số:
- Luồng có thể ghi bắt buộc đóng vai trò là đích đến cho dữ liệu và
- Một đối tượng tùy chọn được sử dụng để truyền vào 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, hãy xem một ví dụ về cách chúng ta có thể truyề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 datainput.txt có dữ liệu bên dưới. Giả sử tệp này được lưu trữ trên ổ 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
Generators
Kết nối dữ liệu
Sử dụng hoa nhài
Bước 2) Tạo một tệp trống có tên dataOutput.txt và đặt nó vào ổ 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ã: -
- Trước tiên, chúng tôi tạo một “dòng đọc” cho tệp datainput.txt chứa tất cả dữ liệu cần được chuyển sang tệp mới.
- Sau đó, chúng tôi cần tạo một “dòng ghi” vào tệp dataOutput.txt, đây là tệp trống của chúng tôi và là đích để truyền dữ liệu từ tệp datainput.txt.
- 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 ống sẽ lấy tất cả dữ liệu đi vào luồng đọc và đẩy nó vào luồ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 chính trong Node.js và đôi khi Node.js được gọi là framework 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 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 hướng sự kiện là tạo ra các chức năng 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_receured'. 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ã: -
- 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 sự kiện trong Node.js.
- 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_received” với hàm gọi lại được xác định ở bước 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_received” được kích hoạt thì chúng tôi sẽ xuất văn bản “data_receured” ra bảng điều khiển.
- Cuối cùng, chúng ta có một trình kích hoạt thủ công cho sự kiện của mình bằng cách sử dụng hàm eventEmiter.emit. Điều này sẽ kích hoạt sự kiện data_received.
Khi chương trình chạy, dòng chữ “data đã nhận” sẽ được gửi tới console như hình dưới đây.
Sự kiện phát ra
Khi xác định sự kiện, có nhiều 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 cái một cách chi tiết.
- 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 lại một sự kiện ngay 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ã: -
- Ở đây chúng ta đang sử dụng phương thức 'once' để nói rằng đối với sự kiện 'data_received', hàm gọi lại chỉ được thực thi một lần.
- Ở đây chúng tôi đang kích hoạt sự kiện 'data_receured' theo cách thủ công.
- Khi sự kiện 'data_receured' được kích hoạt 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 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, đầu ra trong nhật ký sẽ là 'data_receured 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.
- Kiểm tra trình xử lý sự kiện
Tại bất kỳ thời điểm nào trong vòng đời của nó, trình phát sự kiện có thể có không hoặc nhiều trình 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 nhiều cách.
Nếu bạn chỉ quan tâm đến việc xác định số lượng người nghe được đính kèm thì không cần tìm đâu xa ngoài phương thức EventEuctor.listenerCount().
(Lưu ý: Trình nghe rất quan trọng vì chương trình chính phải biết liệu trình nghe có được thêm ngay vào một sự kiện hay không, nếu không chương trình sẽ gặp trục trặc vì các trình nghe bổ sung sẽ được gọi.)
Giải thích mã: -
- Chúng tôi đang xác định loại eventEmitter cần thiết để sử dụng các phương thức liên quan đến sự kiện.
- Sau đó, chúng tôi sẽ 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.
- Chúng tôi đang tạo 2 trình xử lý sự kiện mà về cơ bản không làm gì cả. Điều này được giữ đơn giản trong ví dụ của chúng tôi chỉ để hiển thị cách hoạt động của phương thức listenCount.
- Bây giờ, khi bạn gọi phương thức listenCount trên sự kiện data_received của chúng tôi, nó sẽ gửi số lượng trình xử lý 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ị 2 sẽ được hiển thị trong nhật ký bảng điều khiển.
- Sự kiện newListener
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 newListener. 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 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ã: -
- 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ý, dòng chữ “Đã thêm trình nghe cho” + tên sự kiện sẽ được hiển thị trong bảng điều khiển.
- Ở đây chúng tôi đang viết vào bảng điều khiển nội dung “Đã thêm trình nghe cho” + tên sự kiện cho mỗi sự kiện đã đăng ký.
- Chúng tôi đang xác định 2 trình xử lý sự kiện cho sự kiện 'data_receured' của mình.
Nếu đoạn mã trên được thực thi đúng cách, văn bản bên dưới sẽ được hiển thị trong bảng điều khiển. Nó chỉ cho thấy 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_received
Đã thêm trình nghe cho các sự kiện data_received
Tổng kết
- 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. Những luồng này có thể được sử dụng để đọc và ghi dữ liệu từ các tập tin.
- Ố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à kết hợp luồng đọc và ghi để 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ẻ dưới dạng khung hướng sự kiện và rất dễ 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.
- Các sự kiện cũng đưa ra các phương pháp phản hồi các sự kiện quan trọng. 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 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.