8

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

我已经阅读了 @nodejs.org 的 Buffer/Streams 文档,观看了 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 模块
  • 我可以通过简单地从to中添加一些信息来解决 和 之间的依赖问题getRecipe,这可以通过 RDF 轻松完成,而不会破坏原始数据模型。但是我仍然很想知道我是否可以使用管道处理这样的依赖项createMealgetRecipeparseRDF
4

1 回答 1

6

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

于 2012-10-22T00:17:43.780 回答