2017-03-07 56 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