biến đổi
Các luồng chuyển đổi đều có thể đọc và ghi được, và do đó là các luồng 'trung bình' thực sự tốt. Vì lý do này, đôi khi chúng được gọi là through
luồng. Chúng tương tự như một luồng song công theo cách này, ngoại trừ chúng cung cấp một giao diện đẹp để thao tác dữ liệu thay vì chỉ gửi nó qua. Mục đích của luồng biến đổi là thao tác dữ liệu khi nó được dẫn qua luồng. Ví dụ, bạn có thể muốn thực hiện một số cuộc gọi không đồng bộ hoặc lấy một vài trường, sắp xếp lại một số thứ, v.v.
Để biết cách tạo một luồng biến đổi, hãy xem tại đây và đây . Tât cả nhưng điêu bạn phải lam la :
- bao gồm các mô-đun dòng
- khởi tạo (hoặc kế thừa từ) lớp Transform
- thực hiện một
_transform
phương pháp trong đó có một (chunk, encoding, callback)
.
Chunk là dữ liệu của bạn. Hầu hết thời gian bạn sẽ không cần phải lo lắng về mã hóa nếu bạn đang làm việc trongobjectMode = true
. Cuộc gọi lại được gọi khi bạn xử lý xong đoạn. Đoạn này sau đó được đẩy sang luồng tiếp theo.
Nếu bạn muốn một mô-đun trình trợ giúp đẹp cho phép bạn thực hiện thông qua luồng thực sự dễ dàng, tôi đề nghị thông qua2 .
Để xử lý lỗi, tiếp tục đọc.
ống
Trong một chuỗi ống, xử lý lỗi thực sự là không tầm thường. Theo chủ đề này .pipe () không được xây dựng để chuyển tiếp lỗi. Vì vậy, một cái gì đó như ...
var a = createStream();
a.pipe(b).pipe(c).on('error', function(e){handleError(e)});
... sẽ chỉ lắng nghe lỗi trên luồng c
. Nếu một sự kiện lỗi được phát ra a
, điều đó sẽ không được truyền lại và trên thực tế, sẽ xảy ra. Để làm điều này một cách chính xác:
var a = createStream();
a.on('error', function(e){handleError(e)})
.pipe(b)
.on('error', function(e){handleError(e)})
.pipe(c)
.on('error', function(e){handleError(e)});
Bây giờ, mặc dù cách thứ hai dài dòng hơn, ít nhất bạn có thể giữ bối cảnh nơi xảy ra lỗi của mình. Đây thường là một điều tốt.
Một thư viện tôi thấy hữu ích mặc dù nếu bạn gặp trường hợp bạn chỉ muốn ghi lại các lỗi ở đích và bạn không quan tâm lắm đến việc nó xảy ra ở đâu là luồng sự kiện .
kết thúc
Khi một sự kiện lỗi được kích hoạt, sự kiện kết thúc sẽ không được kích hoạt (một cách rõ ràng). Việc phát ra một sự kiện lỗi sẽ kết thúc luồng.
tên miền
Theo kinh nghiệm của tôi, các miền hoạt động thực sự tốt hầu hết thời gian. Nếu bạn có một sự kiện lỗi chưa được xử lý (nghĩa là phát ra lỗi trên luồng mà không có người nghe), máy chủ có thể gặp sự cố. Bây giờ, như bài viết trên chỉ ra, bạn có thể gói luồng trong một miền cần nắm bắt đúng tất cả các lỗi.
var d = domain.create();
d.on('error', handleAllErrors);
d.run(function() {
fs.createReadStream(tarball)
.pipe(gzip.Gunzip())
.pipe(tar.Extract({ path: targetPath }))
.on('close', cb);
});
Vẻ đẹp của tên miền là chúng sẽ lưu giữ các dấu vết ngăn xếp. Mặc dù dòng sự kiện cũng làm tốt công việc này.
Để đọc thêm, hãy xem cuốn sổ tay stream . Khá sâu sắc, nhưng siêu hữu ích và cung cấp một số liên kết tuyệt vời đến nhiều mô-đun hữu ích.
Promise
các khung làm cho nó đơn giản hơn rất nhiều