如何使用Streams2 ObjectMode?

在Node v10.11中,我试图把对象放在一个pipe道上,但是我总是得到错误。

events.js:72 throw er; // Unhandled 'error' event ^ TypeError: Invalid non-string/buffer chunk at validChunk (_stream_writable.js:150:14) at WriteStream.Writable.write (_stream_writable.js:179:12) 

我能做到

 this.push(chunk) 

直接通过pipe道传输数据,但我做不到

 var result = {'the web content is': chunk} this.push(result) 

30 LOC中的可运行示例:

 var stream = require('stream'); var MsgExtractStream = function() { stream.Transform.call(this,{objectMode: true}); } MsgExtractStream.prototype = Object.create( stream.Transform.prototype, {constructor: {value: MsgExtractStream}} ) MsgExtractStream.prototype._transform = function(chunk, encoding, callback) { var result = {'the website is': chunk}; this.push(result); } MsgExtractStream.prototype.write = function () { this._transform.apply(this, arguments); }; MsgExtractStream.prototype.end = function () { this._transform.apply(this, arguments); this.emit("end"); }; var fs = require("fs"), inPage = fs.createReadStream("inPage.html"), outPage = fs.createWriteStream("outPage.html"), msgPage = new MsgExtractStream(); inPage. pipe(msgPage). pipe(outPage); 

除了最后一个陈述之外,你所做的一切都是正确的。 您正在将带有objectMode的Transformstream的MsgExtractStream的结果objectMode给一个简单的stream。

当你pipe道,你从msgPage读取的东西,你得到的对象 ,然后写入outPage。 但outPage没有objectMode ,所以它需要string/缓冲区,并在写入时抛出错误。

尝试做只有一个pipe道,它将工作。

编辑

这是我debugging错误的方法,一个pipe道不会导致错误。 首先,我们将检查这样的数据stream:

 string stream -> object stream -> string stream string object 

您在MsgExtractStream中获取的块是来自inPage的string。 任何对象都可以,不只是string。 在这个转换中,你写了一个包装在对象中的块来输出。 你得到一个string,并写一个对象。

你现在有两个select。 为了解决这个问题, MsgExtractStream应该返回string,就像你做this.push(chunk) ,这样下一个pipe道就可以工作。

或者如果你需要对象stream,你可以从MsgExtractStream获得。 你将需要像这样的另一个pipe道:

 string stream -> object stream -> object stream -> string stream string object string 

第一个对象stream从string创build一个对象,第二个从一个对象创buildstring。 你将不得不处理链上的物体types,以便pipe道。