digiRunner Composer node-red

Composer 訊息合併的幾種方法

顏綸 Lun Yan 2023/11/29 18:46:58
374

前言

如果還不知道什麼是 Composer 的,可以先參考這篇 DigiRunnerAPI組合與設計 。

這篇主要是講解當想要合併兩個以上的訊息至同一個節點時,該如何編輯節點。

 

 

一、目的

接下來的範例皆會出現三個 function 節點,分別是 "輸出參數1" 、 "輸出參數2" 和 "接收參數",

我們需要將這兩個 "輸出參數1" 和 "輸出參數2" 節點 return 的參數合併,並且傳給 "接收參數" 節點

假設 "輸出參數1" 輸出

{ "payload":  { "one": 123 } }

"輸出參數2" 輸出

{ "payload":  { "two": 456 } }

那我們目的就是要合併的訊息變成

{ "payload":  { "one": 123, "two": 456 } }

 

 

二、錯誤示範

一般我們直覺操作會是只要將兩個節點輸出拉向同一個節點就會將訊息給合併,如下圖所示:

當我按下 inject 節點時,分別會傳送兩個訊息至 "輸出參數1" 和 "輸出參數2" 的節點,

此兩個 function 節點執行完該節點內部邏輯再個別輸出訊息到 "接收參數" 的節點,這表示 "接收參數" 的節點會做兩次,

並且沒有將 "輸出參數1" 和 "輸出參數2" 節點 return 出來的參數合併在一起。

 

 

三、正確示範

所以為了達到合併目的,需要再加一點小手段,以下有幾個方法供大家參考:

 

方法一:

使用 join 節點,如下圖所示:

join 節點可以等待 "輸出參數1" 和 "輸出參數2" 一起輸出後,會收集參數並依照 join 節點的設定來合併訊息。

該節點設定如下圖所示:

我們要選擇合併對象是 payload ,並且因為只有兩個節點連到 join 的 input 端,

所以 "達到一定數量的資訊時",那個空格要填 2 ,如果三個節點就填 3 ,以此類推。

 

方法二:

使用訊息 (msg) 來傳遞:

我們能在 "輸出參數2" 節點寫一些邏輯如以下程式碼所示:

msg.payload = {
    ...msg.payload,
    "two": 456
}
return msg;
 
該方法是直接 在 "輸出參數2" 節點把 "輸出節點1" 傳出的參數合併在一起。
 
 

方法三:

使用全域變數:

我們能在 "輸出參數1" 節點寫一些邏輯如以下程式碼所示:
 
flow.set("globalSend", {
    "one": 123
})
return msg;

"輸出參數2" 節點程式碼:

flow. set( "globalSend2", {
    "two": 456
})
return msg;

"接收參數" 節點程式碼:

const globalSend = flow. get( "globalSend");
const globalSend2 = flow. get( "globalSend2");
const result = {
    ...globalSend,
    ...globalSend2
};
msg.payload = result;
return msg;

"輸出參數1" 與 "輸出參數2" 皆為設定全域變數,"接收參數" 再把全域變數取出來並合併。

 

 

四、結語

其實還有很多方法就不一一列舉,而一般 JS 工程師大部分都會用方法二或三,

不過如果要讓 Composer 流程可視化、可讀性較高,建議用方法一。

 

 

顏綸 Lun Yan