我已经编写了要传递到的函数,该函数会将提供的参数记录到控制台。

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


为什么?

最佳答案

您不能像这样将objectMode和非objectMode流混合/管道传输在一起,因为它们可以使用不同的数据类型。

但是,如果您拥有节点v0.12 +或io.js,则可以使用readableObjectMode: true之类的方法,该方法设置转换流的可读性以读取对象,但按常规写入字节。您可以使用writableObjectMode: true进行其他类似的操作(objectMode: true等同于将这两个属性都设置为true)。这样,您就可以在一种流类型之间转换。

09-20 17:22