2017-03-07 55 views
0

我想了解流如何在nodejs中工作。要做到这一点,我写了这个代码readableObjectMode与字符串

'use strict' 

var fs = require('fs') 
var split = require('split') 
var stream = require('stream') 

const myTransform = new stream.Transform({ 
    writableObjectMode: true, 
    readableObjectMode: true, 
    transform (chunk, encoding, callback) { 
    console.log('transform', chunk) // chunk is a string 
    this.push({chunk: chunk}) 
    callback() 
    } 
}) 

const myWritable = new stream.Writable({ 
    objectMode: true, 
    write (chunk, encoding, callback) { 
    console.log('writable', chunk) 
    callback() 
    } 
}) 

myWritable.on('finish',() => console.log('FINISHED')) 
fs.createReadStream(__dirname + '/prova.txt') 
    .pipe(split()) 
    .pipe(myTransform) 
    .pipe(myWritable) 

这个例子效果很好,但我不明白为什么,如果变换流已经设置readableObjectModefalse,脚本失败

transform line1 
stream.js:74 
     throw er; // Unhandled stream error in pipe. 
    ^

TypeError: Invalid non-string/buffer chunk 
    at chunkInvalid (_stream_readable.js:380:10) 
    at readableAddChunk (_stream_readable.js:125:12) 
    at Transform.Readable.push (_stream_readable.js:111:10) 
    at Transform.push (_stream_transform.js:128:32) 
    at Transform.transform [as _transform] (/path/to/mystream.js:12:10) 
    at Transform._read (_stream_transform.js:167:10) 
    at Transform._write (_stream_transform.js:155:12) 
    at doWrite (_stream_writable.js:301:12) 
    at writeOrBuffer (_stream_writable.js:287:5) 
    at Transform.Writable.write (_stream_writable.js:215:11) 

回答

1

文件是不是如此清楚但

  1. readableObjectMode是相对于“阅读方”。所以如果真的,你可以推动一个对象。否则必须使用字符串或缓冲区
  2. writableObjectMode与“写入端”相关。所以方法transform有一个对象作为第一个参数。

因此,在上面的示例中,writableObjectMode参数可以设置为false

NB:如果writableObjectMode设置为false,变换方法接收的Buffer实例作为chunk