2015-06-21 2 views
2

Я написал функцию, которая будет подключаться к ней, и будет записывать предоставленные аргументы в консоль.Почему эта функция потока приводит к ошибке?

function sconsole() { 
    var stream = new Stream.Transform({objectMode: true}), 
     foo = [].slice.call(arguments); 

    stream._transform = function (data, encoding, callback) { 
     console.log.apply(null, foo); 
     callback(null, data); 
    }; 

    return stream; 
} 

Пример использования:

stream 
    .pipe(sconsole('foo')) 
    .pipe(...); 

Но при использовании в конечном положении последовательности труб вызовов, это вызывает следующее сообщение об ошибке:

TypeError: Invalid non-string/buffer chunk 

Почему?

+0

Я бы выбрал значения, исходящие из sconsole. Не уверен в новом потоке, если у вас нет функции или объекта под названием Stream где-то рядом. – MinusFour

ответ

2

Вы не можете смешивать/труба objectMode и не objectMode потоки вместе, потому что они работают с разными типами данных.

Однако, если у вас есть узел v0.12 + или io.js, вы мог использовать что-то вроде readableObjectMode: true, который устанавливает читаемую сторону вашего преобразования потока для чтения объектов, но писать байты в обычном режиме. Вы можете сделать что-то подобное по-другому с writableObjectMode: true (objectMode: true эквивалентно установке обоих этих свойств на true). Таким образом, вы можете конвертировать один тип потока в другой.

+0

Большое спасибо. Итак, вы говорите, что позиция в цепочке труб влияет на тип данных, входящий в функцию? – Ben

+0

Не совсем так, как создается или настраивается ваш поток, который определяет, какой тип ввода вы ожидаете получить и какой выход будет. До узлов v0.12 и io.js это были либо только двоичные данные/строки, либо только объекты в обоих направлениях. Новые версии позволяют независимо изменять типы ввода и вывода. Важно убедиться, что вы потоки трубопроводов, чтобы тип вывода одного потока соответствовал типу ввода следующего потока. – mscdex

+0

ОК. Итак, если у меня есть что-то вроде следующего, как мне настроить функцию 'console' так, чтобы она соответствовала? '' 'stream.pipe (tap (файл => temp.css = file.contents.toString())) .pipe (sconsole ('foo')); '' ' – Ben

Смежные вопросы