在Node.js中pipe理/stream式处理JavaScript对象

我试图把我的头围绕Node.jsstream,而不是我对JavaScript和节点很新,我真正得到的最后几种语言是Perl和PHP:-D

我读过Buffer / Streams文档@ nodejs.org,观看了James Halliday @ LXJS ,阅读了他的stream手册和Thorsten Lorenz 事件stream文章 。 我开始了解基础知识:)

我处理在RDF中序列化的数据(既不是JSON也不是XML)。 我设法获取数据(通过请求的实际代码),并使用rdfstore模块parsing成一个JS对象。

到目前为止,我这样做:

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

其中serialize()执行parsing序列化代码的工作。 我through模块使用接口到stream。

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

  • getRecipe(parsedRDF) – >将parsing的RDF(作为一个JavaScript对象)告诉我如何使用它
  • createMeal(parsedRDF, recipe) – >从上面获取parsing的RDF和配方,并创build一个新的RDF对象
  • 这个新对象需要序列化并发送到浏览器
  • (在现实世界中, getRecipe将不得不在浏览器中进行用户交互)

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

  • 这实际上是有道理的吗? 在我添加不必要的开销或这是可以忽略的?
  • 我没有看到我怎么可以将parsedRDF赋予这两个方法的getRecipe必须先被调用的依赖项,输出也是createMealinput。 有模块可以帮助我吗?
  • 这可能是我必须要求用户select最终的食谱,所以我可能需要发送东西到浏览器那里得到最终的答案。 当pipe道“等待”时,我可以在套接字上做这样的事吗?

我希望这显示我想要做什么,如果不是,我会尝试给更多的细节/改变。

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

  • 如果有官方的序列化格式,将RDF等格式序列化为非标准格式可能没有意义。 所以,而不是使用stringify我会简单地通过一个正式的RDF序列化之间的步骤
  • 这确实意味着我parsing/序列化每个步骤中的对象,这肯定会增加开销。 问题是我关心吗? 我可以扩展RDF模块,我使用从streamparsing和序列化到一个
  • 我可以通过简单地将getRecipe一些信息添加到parseRDF来解决getRecipecreateMeal之间的依赖问题,这可以通过RDF轻松完成,而不会破坏原始数据模型。 但我仍然有兴趣知道我是否可以用pipe道处理这样的依赖

是的,做一个js对象stream是可以的,你只需要记住把它写入IO之前,再把它串行化。

我build议编写一个名为rdfStream的模块来parsing和序列化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. 

而且它也可以被其他使用rdf的人在节点中使用,太棒了!