如何使用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的Transform
stream的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道。