如何查询 NodeJS 流“元数据”

How to query NodeJS stream 'meta data'?

本文关键字:元数据 NodeJS 何查询 查询      更新时间:2023-09-26

我有一个程序,有几个长管道和几个转换。

例如

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,我正在将我使用的大部分流转换提升为"元"Monad。 我还在学习哈斯克尔,所以这个观察可能是不正确的。

您可以使用

pipe事件:

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

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

就Haskell而言,它听起来像一个Reader moand,其中Pipeline执行功能需要一个Reader,它完全满足了管道各个管道的所有元数据需求。