2013-10-18 26 views
0

我有一個程序與幾個變換幾個長管道。如何查詢NodeJS流'元數據'?

例如

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

向/從管道添加/讀取元數據的最佳方式是什麼?

例如:ta將數據包累積並分解成行。 tb需要在每行的前面添加基於始發IP地址(如果有的話)的數據。

tb如何從其輸入中獲得remoteAddress

這裏似乎與原型遺傳有一些相似之處。即tb應該詢問ta(它缺乏財產),那麼ta應該詢問socket(它有屬性)。

我正在尋找從管道添加和讀取元數據的一般方法,因爲我有其他更復雜但相似的問題。

我目前正在通過使用由'meta和​​屬性對象組成的'對象流'來解決此問題。每個轉換必須做到​​,大多數只留下meta。這種解決方案很難看,尤其是因爲我必須創建一個看起來像net的新模塊xnet,但生成這些增強對象,而不是普通緩衝區或字符串。

(Haskellers可能會認識到這一點的解決方案作爲一個單子,在那裏我擡起大部分流的轉變我使用到「元」單子。我還在學習Haskell,所以這種觀察可能不正確。)

+1

如果元數據是流水線執行的特定實例的只讀數據,那麼爲什麼不在創建單個管道時傳遞此數據。例如:'socket.pipe(new Ta(address))' – Ankur

+0

就Haskell而言,它聽起來像是一個Reader moand,其中Pipeline執行函數需要一個Reader,它完全滿足管道中各個管道的所有元數據需求 – Ankur

+0

@Ankur這是一個有趣的解決方案,但它讓我意識到,元數據確實需要每個'數據包'。當多個TCP連接將它們的數據合併到一個流水線中時,下游消費者只有在數據包中才能找到元數據。 (不同的數據包將來自不同的TCP連接。) – fadedbee

回答

1

如果元數據是隻讀的管道執行的特定實例數據,那麼在創建單獨的管道,爲什麼不通過這個數據。例如:socket.pipe(新的Ta(地址))

就Haskell而言,它聽起來像一個Reader moand,其中Pipeline執行功能需要一個Reader,它可以完全滿足所有單個管道的元數據需求管道

1

可以使用pipe事件:

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

謝謝,但'ta'在開始時沒有'remoteAddress'只有'socket'。 – fadedbee

+0

然後,你可以通過監聽成功的管道事件來傳播初始流嗎? –