Мне кажется, что элегантный способ обработки определенных видов данных в Node.js - это цепочка объектов обработки, таких как каналы UNIX.
Например, grep:
function Grep(pattern) {
...
}
util.inherits(Grep, stream.Stream);
Grep.prototype.???? = ??????? // What goes here?
grep = new Grep(/foo/);
process.stdin.pipe(grep);
myStream.pipe(process.stdout);
Однако мне не совсем понятно, как различные методы Stream должны быть переопределены, чтобы это работало.
Как я могу создать объект Stream, который просто копирует его входные данные в свои выходные? Предположительно с учетом этого, более сложные потоки фильтрации становятся тривиальными.
Обновление: такое ощущение, что должно работать следующее (выражается в CoffeeScript, поэтому я не заполняю это поле синтаксисом JS!):
class Forwarder extends stream.Stream
write: (chunk, encoding) ->
@emit 'data', chunk
end: (chunk, encoding) =>
if chunk?
@emit 'data', chunk
@emit 'end'
fwd = new Forwarder()
fwd.pipe(process.stdout);
process.stdin.pipe(fwd);
process.stdin.resume();
Однако, что-то в этом скрипте ничего не выводит. Явный вызов fwd.write () в скрипте вызывает вывод на стандартный вывод.