我有一个带有几个长管的程序,有几个转换。
e.g。
socket.pipe(ta).pipe(tb).pipe(tc);
...
tc.pipe(other_socket);
在管道中添加/读取元数据的最佳方法是什么?
例如:ta
累积并将数据包分成行。 tb
需要在每行前面添加基于原始IP地址(如果有)的数据。
tb
如何从其输入中获取remoteAddress
?
这里似乎与原型继承有一些相似之处。即tb
应该询问ta
(缺少属性),然后ta
应该询问socket
(具有该属性)。
我正在寻找一种从管道添加和读取元数据的一般方法,因为我还有其他更复杂但类似的问题。
我目前正在通过使用由具有meta
和payload
属性的对象组成的“对象流”来解决此问题。每个转换必须将其内容转移到payload
,并且大多数转移meta
。这个解决方案很难看,特别是因为我必须创建一个新的xnet
模块,它看起来像net
但生成这些扩充对象,而不是普通的缓冲区或字符串。
(Haskellers可能会认为这个解决方案是Monad,我将大部分流变换提升到“meta”Monad。我还在学习Haskell,所以这个观察结果可能不正确。)
答案 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来完全填充管道各个管道的所有元数据要求