在Node.js中管道/流式传输JavaScript对象

Adr*_*end 7 javascript pipe object stream node.js

我试图绕过Node.js流,而不是我对JavaScript和节点很新,我真正得到的最后一种语言是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);
Run Code Online (Sandbox Code Playgroud)

serialize()现在解析序列化代码的工作在哪里.我使用through模块来连接流.

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

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

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

  • 这真的有意义吗?我是否会增加不必要的开销或者这可以忽略不计?
  • 我不知道如何将parsedRDF提供给两个方法,这些方法getRecipe必须首先调用依赖,输出也是输入createMeal.是否有模块可以帮助我?
  • 可能是我必须要求用户选择最终的配方,所以我可能需要将内容发送到浏览器以获得最终答案.当管道"等待"时,我可以在插座上做这样的事情吗?

我希望这表明我正在尝试做什么,如果不是,我会尝试提供更多细节/改述.

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

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

dom*_*nic 5

是的,可以创建一个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.
Run Code Online (Sandbox Code Playgroud)

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