如何使用Streams2 ObjectMode?

McP*_*dr0 14 node.js streams2

在Node v10.11中,我试图将对象推向管道,但我总是得到错误.

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)
Run Code Online (Sandbox Code Playgroud)

我能做到

this.push(chunk)
Run Code Online (Sandbox Code Playgroud)

直接管道数据,但我做不到

var result = {'the web content is': chunk}
this.push(result)
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

use*_*109 9

除了最后一句话,你所做的一切都是正确的.您将Transform带有objectModeon 的流的MsgExtractStream的结果汇总到一个简单的流.

管道时,你从msgPage读取东西,得到对象,然后将它们写入outPage.但是outPage没有objectMode打开,所以它需要字符串/缓冲区并在写入时抛出错误.

尝试只做一个管道,它会工作.

编辑

这是我调试错误的方法,一个管道不会导致错误.首先,我们将检查数据流,如下所示:

string stream -> object stream -> string stream
             string          object
Run Code Online (Sandbox Code Playgroud)

您在MsgExtractStream中获得的块是来自inPage的字符串.任何对象不仅仅是字符串都可以.在转换中,您将包装在对象中的块写入输出.你得到一个字符串并写一个对象.

你现在有两个选择.要解决此问题,MsgExtractStream应该返回字符串,就像这样this.push(chunk),以便下一个管道工作.

或者如果你需要对象流,你就可以得到MsgExtractStream.你需要这样的另一个管道:

string stream -> object stream -> object stream -> string stream
            string           object           string
Run Code Online (Sandbox Code Playgroud)

第一个对象流从字符串创建对象,第二个从对象创建字符串.您将不得不处理链中对象的类型,以便管道.