przekształcać
Strumienie transformacji są zarówno czytelne, jak i zapisywalne, a zatem są naprawdę dobrymi strumieniami „środkowymi”. Z tego powodu czasami nazywa się je through
strumieniami. W ten sposób są podobne do strumienia dupleksowego, z wyjątkiem tego, że zapewniają przyjemny interfejs do manipulowania danymi, a nie tylko ich wysyłania. Celem strumienia transformacji jest manipulowanie danymi podczas przesyłania ich przez strumień. Możesz na przykład chcieć wykonać kilka wywołań asynchronicznych lub wyprowadzić kilka pól, zmienić mapowanie niektórych rzeczy itp.
Aby dowiedzieć się, jak utworzyć strumień transformacji, zobacz tutaj i tutaj . Wszystko co musisz zrobić to :
- zawierać moduł strumienia
- Utwórz wystąpienie (lub dziedzicz z) klasy Transform
- zaimplementuj
_transform
metodę, która przyjmuje plik (chunk, encoding, callback)
.
Kawałek to twoje dane. W większości przypadków nie musisz martwić się o kodowanie, jeśli pracujesz w programie objectMode = true
. Wywołanie zwrotne jest wywoływane po zakończeniu przetwarzania porcji. Ten fragment jest następnie wypychany do następnego strumienia.
Jeśli potrzebujesz fajnego modułu pomocniczego, który pozwoli ci naprawdę łatwo przejść przez stream, proponuję przez through2 .
Aby uzyskać informacje na temat obsługi błędów, czytaj dalej.
rura
W łańcuchu potoków błędy obsługi są rzeczywiście nietrywialne. Zgodnie z tym wątkiem .pipe () nie jest zbudowany do przekazywania błędów. Więc coś w stylu ...
var a = createStream();
a.pipe(b).pipe(c).on('error', function(e){handleError(e)});
... nasłuchiwał tylko błędów w strumieniu c
. Gdyby wyemitowano zdarzenie błędu a
, nie zostałoby ono przekazane, a faktycznie zostałoby odrzucone. Aby zrobić to poprawnie:
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)});
Teraz, chociaż drugi sposób jest bardziej szczegółowy, możesz przynajmniej zachować kontekst, w którym występują błędy. Zwykle jest to dobra rzecz.
Jedna biblioteka, którą uważam za pomocną, jeśli masz przypadek, w którym chcesz uchwycić tylko błędy w miejscu docelowym i nie obchodzi Cię tak bardzo, gdzie to się stało, to strumień zdarzeń .
koniec
Gdy zostanie wyzwolone zdarzenie błędu, zdarzenie końcowe nie zostanie uruchomione (jawnie). Emisja zdarzenia błędu zakończy transmisję.
domeny
Z mojego doświadczenia wynika, że domeny działają bardzo dobrze przez większość czasu. Jeśli masz nieobsłużone zdarzenie błędu (np. Emitowanie błędu w strumieniu bez nasłuchiwania), serwer może ulec awarii. Teraz, jak wskazuje powyższy artykuł, możesz umieścić strumień w domenie, która powinna poprawnie wychwycić wszystkie błędy.
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);
});
Piękno domen polega na tym, że zachowują ślady stosu. Chociaż strumień wydarzeń również dobrze sobie z tym radzi.
Aby uzyskać więcej informacji, zapoznaj się z podręcznikiem transmisji strumieniowej . Całkiem dogłębne, ale bardzo przydatne i zawiera świetne linki do wielu pomocnych modułów.
Promise
frameworki czynią to o wiele prostszym