Node.js 中的管道/流式处理 JavaScript 对象

Posted

技术标签:

【中文标题】Node.js 中的管道/流式处理 JavaScript 对象【英文标题】:Piping/streaming JavaScript objects in Node.js 【发布时间】:2012-10-03 20:29:10 【问题描述】:

我正试图围绕 Node.js 流转转,并不是说我对 javascript 和 node 很陌生,我真正掌握的最后一种语言是 Perl 和 php :-D

我已经阅读了 @nodejs.org 的 Buffer/Streams 文档,观看了 James Halliday @LXJS,阅读了他的流手册和 Thorsten Lorenz event-stream post。我开始了解基础知识:)

我处理在 RDF 中序列化的数据(既不是 JSON 也不是 XML)。我设法获取数据(通过请求在真实代码中)并使用 rdfstore 模块将其解析为 JS 对象。

到目前为止,我是这样做的:

s.createReadStream('myRDFdata.ttl').pipe(serialize()).pipe(process.stdout);

serialize()现在在哪里同时解析和序列化代码。我使用through 模块来连接流。

现在我有更多方法(不是真正的函数声明,但我希望你明白这一点):

getRecipe(parsedRDF) -> 获取解析后的 RDF(作为 JavaScript 对象)并告诉我如何使用它 createMeal(parsedRDF, recipe) -> 从上面获取已解析的 RDF 和配方,并从中创建一个新的 RDF 对象 这个新对象需要序列化并发送到浏览器 (在现实世界中getRecipe 必须在浏览器中进行用户交互)

我喜欢在以后增强代码时通过管道将它们链接在一起以获得更高的灵活性的想法。但我不想每次都将它序列化为 RDF 序列化,而只是发送 JS 对象。根据我在文档中阅读的内容,我可以使用 stringify 模块从每个步骤中获取一个字符串,以便将其传递到下一步。但是:

这真的有意义吗?我是否会增加不必要的开销,或者这可以忽略不计? 我不知道如何将 parsedRDF 提供给这两种方法,因为必须首先调用 getRecipe 并且输出也是 createMeal 的输入。有没有可以帮助我的模块? 可能我必须向用户询问最终的配方选择,因此我可能需要将内容发送到那里的浏览器以获得最终答案。当管道“等待”时,我可以在套接字上做这样的事情吗?

我希望这表明我正在尝试做的事情,如果不是,我会尝试提供更多细节/改写。

更新:睡了之后我想出了更多的东西:

如果有官方序列化格式,将像 RDF 这样的格式序列化为非标准格式可能没有意义。因此,我不会使用stringify,而是简单地在步骤之间传递官方 RDF 序列化 这确实意味着我在每个步骤中解析/序列化对象,这肯定会增加开销。问题是我在乎吗?我可以扩展我用来从流中解析并序列化的 RDF 模块 我可以解决getRecipecreateMeal 之间的依赖关系问题,只需将getRecipe 中的一些信息添加到parseRDF,这可以通过RDF 轻松完成,而不会破坏原始数据模型。但我仍然想知道我是否可以使用管道处理这样的依赖项

【问题讨论】:

【参考方案1】:

是的,做一个js对象流是可以的, 您只需要记住在将流写入 IO 之前通过管道将其再次序列化。

我建议编写一个名为 rdfStream 的模块来解析和序列化 rdf,你可以这样使用它

var rdf = require('rdf-stream')

fs.createReadStream(file) //get a text stream
  .pipe(rdf.parse())      //turn it into objects 
  .pipe(transform)        //optional, do something with the objects
  .pipe(rdf.stringify())  //turn back into text
  .pipe(process.stdout)   //write to IO.

它也可以被其他在 node 中使用 rdf 的人使用,太棒了!

【讨论】:

感谢您的回答,我确实会为 RDF 库添加管道支持,并将其作为模块提供!

以上是关于Node.js 中的管道/流式处理 JavaScript 对象的主要内容,如果未能解决你的问题,请参考以下文章

Node.js如何流式传输音频文件

如何使用 Asyncio 在 3 个子进程(使用管道)之间流式处理数据并使用结果数据

使用 Node 流式传输大型大查询 SELECT?

是否可以通过管道传输到 console.log?

如何将 node.js 中的管道传输到 redis?

将文件解压缩到内存中,调整文件,压缩并流式传输到客户端(Node.js)