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



我正试图了解Node.js流,并不是说我对JavaScript和Node很陌生,我真正掌握的最后一种语言是Perl和PHP:-D

我阅读了Buffer/Streams文档@nodejs.org,观看了James Halliday@LXJS,阅读了他的流手册和Thorsten Lorenz事件流帖子。我开始了解基本情况:)

我处理以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模块扩展为一个
  • 我可以通过简单地将getRecipe中的一些信息添加到parseRDF中来解决getRecipecreateMeal之间的依赖性问题,这可以用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的人使用,太棒了!

相关内容

  • 没有找到相关文章

最新更新