在Nodev10.11中,我试图将对象按下管道,但总是会出错。
events.js:72抛出er;//未处理的“错误”事件^ TypeError:在WriteStream.Writable.write (_stream_writable.js:179:12)的validChunk (_stream_writable.js:150:14)处无效的非字符串/缓冲区块
我能做到
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);发布于 2013-07-25 06:04:21
你所做的每件事都是正确的,除了最后一句。您正在将MsgExtractStream (一个带有objectMode的Transform流)的结果传输到一个简单的流中。
当您在管道中读取来自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第一个对象流从字符串创建一个对象,第二个对象流从一个对象创建一个字符串。您必须处理链上的对象类型,这样它才能进行管道。
https://stackoverflow.com/questions/17580067
复制相似问题