перетворення
Трансформаційні потоки є і читабельними, і записаними, і, таким чином, справді є хорошими середніми потоками. З цієї причини їх іноді називають through
потоками. Вони подібні до дуплексного потоку таким чином, за винятком того, що вони надають приємний інтерфейс для маніпулювання даними, а не просто їх надсилання. Мета потоку трансформації - маніпулювати даними під час проходження через потік. Ви можете, наприклад, зробити кілька викликів асинхронізації або отримати пару полів, перезаписати деякі речі тощо.
Про те, як створити потік перетворень, дивіться тут і тут . Все, що вам потрібно зробити, це:
- включити модуль потоку
- інстанціювати (або успадкувати від) клас Transform
- реалізувати
_transform
метод, який приймає a (chunk, encoding, callback)
.
Частка - це ваші дані. Більшість часу вам не потрібно буде турбуватися про кодування, якщо ви працюєте objectMode = true
. Зворотний виклик викликається, коли ви закінчите обробку шматка. Потім цей шматок переміщується на наступний потік.
Якщо ви хочете приємний модуль помічника, який дозволить вам пройти через потік дуже легко, я пропоную через2 .
Для вирішення помилок продовжуйте читати.
труба
У ланцюзі трубопроводів помилки обробки справді нетривіальні. Відповідно до цього потоку .pipe () не побудований для передачі помилок. Так щось на кшталт ...
var a = createStream();
a.pipe(b).pipe(c).on('error', function(e){handleError(e)});
... слухав би лише помилки в потоці c
. Якщо подія помилки випромінюється далі a
, вона не передаватиметься і, власне, кинеться. Щоб зробити це правильно:
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)});
Тепер, хоча другий спосіб є більш багатослівним, ви можете принаймні зберегти контекст, де трапляються ваші помилки. Зазвичай це гарна річ.
Одна бібліотека, яку я вважаю корисною, хоча у вас є випадок, коли ви хочете зафіксувати лише помилки в пункті призначення, і ви не так сильно переймаєтесь тим, де це сталося, це потік подій .
кінець
Коли подія помилки запускається, кінцева подія не буде запускатися (явно). Виправлення події помилки закінчить потік.
домени
На мій досвід, більшість часу домени працюють дуже добре. Якщо у вас є подія непоправленої помилки (тобто видача помилки в потоці без слухача), сервер може вийти з ладу. Тепер, як зазначено у статті вище, ви можете зафіксувати потік у домені, який повинен належним чином вловлювати всі помилки.
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);
});
Краса доменів полягає в тому, що вони збережуть сліди стека. Хоча подія-потік добре справляється і з цим.
Для подальшого читання перегляньте посібник із потоку . Досить глибоко, але дуже корисно та дає чудові посилання на безліч корисних модулів.
Promise
рамки роблять це набагато простіше