如何查询NodeJS流'元数据'?

时间:2013-10-18 09:09:01

标签: javascript node.js haskell stream meta

我有一个带有几个长管的程序,有几个转换。

e.g。

socket.pipe(ta).pipe(tb).pipe(tc);
...
tc.pipe(other_socket);

在管道中添加/读取元数据的最佳方法是什么?

例如:ta累积并将数据包分成行。 tb需要在每行前面添加基于原始IP地址(如果有)的数据。

tb如何从其输入中获取remoteAddress

这里似乎与原型继承有一些相似之处。即tb应该询问ta(缺少属性),然后ta应该询问socket(具有该属性)。

我正在寻找一种从管道添加和读取元数据的一般方法,因为我还有其他更复杂但类似的问题。

我目前正在通过使用由具有metapayload属性的对象组成的“对象流”来解决此问题。每个转换必须将其内容转移到payload,并且大多数转移meta。这个解决方案很难看,特别是因为我必须创建一个新的xnet模块,它看起来像net但生成这些扩充对象,而不是普通的缓冲区或字符串。

(Haskellers可能会认为这个解决方案是Monad,我将大部分流变换提升到“meta”Monad。我还在学习Haskell,所以这个观察结果可能不正确。)

2 个答案:

答案 0 :(得分:1)

您可以使用pipe事件:

tb.on('pipe', function(ta) {
  console.log('getting data from', ta.remoteAddress);
});

答案 1 :(得分:1)

如果元数据是特定管道执行实例的只读数据,那么为什么不在创建单个管道时传递此数据。像:socket.pipe(new Ta(address))

就Haskell而言,它听起来像是一个Reader moand,其中Pipeline执行函数使用Reader来完全填充管道各个管道的所有元数据要求