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

问题描述 投票:0回答:2

我有一个带有多个长管道和多个转换的程序。

例如

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,我将使用的大部分流转换提升为“元”Monad。我仍在学习 Haskell,因此这种观察可能是不正确的。)

javascript node.js haskell stream
2个回答
2
投票

您可以使用

pipe
事件:

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

1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.