在Node v10.11中,我试图将对象下推到管道中,但是我总是会出错。



我能做

this.push(chunk)

直接通过管道传输数据,但是我做不到
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);

最佳答案

您所做的一切都是正确的,除了最后一条语句。您正在将MsgExtractStream的结果和Transform传递到一个简单流上,并将其传递给objectMode流。
进行管道传输时,您从msgPage中读取内容,则得到对象,然后将它们写入outPage。但是outPage上没有objectMode,因此它需要字符串/缓冲区,并在写入时引发错误。
尝试只做一根管子,它将起作用。
编辑
那是我调试错误的方法,一个管道不会导致错误。首先,我们将检查数据流,如下所示:

string stream -> object stream -> string stream
             string          object
您在MsgExtractStream中获得的块是来自inPage的字符串。任何对象而不仅仅是字符串都可以。在转换中,您将包装在对象中的块写入输出。您得到一个字符串并编写一个对象。
您现在有两个选择。要解决此问题,MsgExtractStream都应返回字符串,就像执行this.push(chunk)一样,以便下一个管道起作用。
或者,如果您需要对象流,则可以从MsgExtractStream获得。您将需要另一个这样的管道:
string stream -> object stream -> object stream -> string stream
            string           object           string
第一个对象流从字符串创建对象,第二个从对象创建字符串。您将必须处理链中对象的类型,以便进行管道传输。

10-04 11:51