gpt4 book ai didi

javascript - 在 Node.js 中管道/流式处理 JavaScript 对象

转载 作者:数据小太阳 更新时间:2023-10-29 04:44:35 25 4
gpt4 key购买 nike

我正在努力研究 Node.js 流,并不是说我对 JavaScript 和 Node 很陌生,我真正掌握的最后一种语言是 Perl 和 PHP:-D

我读过 Buffer/Streams 文档 @ nodejs.org,看过 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 必须在浏览器中进行用户交互)

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

  • 这真的有意义吗?就我是要增加不必要的开销还是可以忽略不计而言?
  • 我不明白如何将 parsedRDF 提供给依赖于 getRecipe 的两种方法必须首先调用,输出是 createMeal 的输入以及。有模块可以帮助我吗?
  • 可能我必须询问用户最终的食谱选择,所以我可能需要将内容发送到那里的浏览器以获得最终答案。我可以在管道“等待”时通过套接字执行类似的操作吗?

我希望这显示了我正在尝试做的事情,如果没有,我会尝试提供更多细节/改写。

更新:经过深思熟虑之后,我又想通了一些东西:

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

最佳答案

是的,做一个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 的人使用,太棒了!

关于javascript - 在 Node.js 中管道/流式处理 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12868969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com