首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Streams2 ObjectMode?

如何使用Streams2 ObjectMode?
EN

Stack Overflow用户
提问于 2013-07-10 20:14:01
回答 1查看 3.5K关注 0票数 14

在Nodev10.11中,我试图将对象按下管道,但总是会出错。

events.js:72抛出er;//未处理的“错误”事件^ TypeError:在WriteStream.Writable.write (_stream_writable.js:179:12)的validChunk (_stream_writable.js:150:14)处无效的非字符串/缓冲区块

我能做到

代码语言:javascript
复制
this.push(chunk)

直接传输数据,但我做不到

代码语言:javascript
复制
var result = {'the web content is': chunk}
this.push(result)

在30个LOC中可运行的示例:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-25 06:04:21

你所做的每件事都是正确的,除了最后一句。您正在将MsgExtractStream (一个带有objectModeTransform流)的结果传输到一个简单的流中。

当您在管道中读取来自msgPage的内容时,您将得到对象,然后将它们写入outPage中。但是outPage没有打开objectMode,所以它需要字符串/缓冲区,并在写入它时抛出错误。

试着只做一根管道,它会工作的。

编辑

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

代码语言:javascript
复制
string stream -> object stream -> string stream
             string          object

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

你现在有两个选择了。要解决这个问题,任何一个MsgExtractStream都应该返回字符串,就像您执行this.push(chunk)时一样,这样下一个管道就可以工作了。

或者,如果您需要对象流,则可以从MsgExtractStream获得。你需要另一根这样的管子:

代码语言:javascript
复制
string stream -> object stream -> object stream -> string stream
            string           object           string

第一个对象流从字符串创建一个对象,第二个对象流从一个对象创建一个字符串。您必须处理链上的对象类型,这样它才能进行管道。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17580067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档