我正试图了解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
中来解决getRecipe
和createMeal
之间的依赖性问题,这可以用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的人使用,太棒了!