節點的 Javascript 檔案
節點 .js
檔案定義節點在執行時期的行為
節點建構式 Node constructor
建構式能夠產生一個新的節點實際例子(instance),並且節點是夠過建構式被定義。當建構式註冊的對應節點被佈署在流程中,這個建構式就會被呼叫。
白話一點就是想要節點有什麼功能都要放在建構式裡設定好
建構式會得到一個物件,裡面有在網頁編輯器設定的節點屬性。
在建構式中,首先一定要先呼叫 RED.nodes.createNode
去初始化所有節點共同的功能
像是後面如何接收訊息跟傳遞訊息
之後,就是節點自己的程式碼了
function SampleNode(config) {
RED.nodes.createNode(this,config);
// node-specific code goes here
}
RED.nodes.registerType("sample",SampleNode);
接受訊息 Receiving messages
節點在 input
事件註冊監聽器,可以得到流程中上一個節點傳送的訊息
this.on('input', function(msg) {
// do something with 'msg'
});
傳送訊息 Sending messages
節點利用 send
函式,將訊息傳送給流程中的下一個
var msg = { payload:"hi" }
this.send(msg);
如果 msg
為 null,則不會傳送任何訊息
如果節點是回應上一個節點傳送過來的訊息,應該要重複使用這個訊息。確保在這個訊息上的其它屬性可以為流程中的其它節點保留起來
Multiple outputs
如果節點需要多個輸出,可以將訊息包成陣列傳遞給 send
。讓訊息對應相對的輸出
this.send([ msg1 , msg2 ]);
Multiple messages
也可以對一個輸出,送出多個訊息。同樣將訊息包裝在陣列中
this.send([ [msgA1 , msgA2 , msgA3] , msg2 ]);
關閉節點 Closing the node
每當佈署新的流程,已存在的節點都會被刪除。如果需要在這種情形整理狀態,ex:從遠端系統斷開連接
節點就需要在 close
事件註冊一個監聽器
this.on('close', function() {
// tidy up any state
});
如果節點需要用非同步的方式整理狀態,註冊的監聽器可以接受一個型態是函數的參數。當做完全部的事情,就可以呼叫這個參數
this.on('close', function(done) {
doSomethingWithACallback(function() {
done();
});
});
從 Node-RED 0.17 版起
如果監聽器接受兩個參數,第一個參數可以用來判斷是 移除節點 還是 重啟節點
this.on('close', function(removed, done) {
if (removed) {
// This node has been deleted
} else {
// This node is being restarted
}
done();
});
逾時行為
從 Node-RED 0.17 版前
執行時會無限期等待節點呼叫函數表示完成工作,如果一直都不呼叫,會導致運作卡在那邊
就像無限迴圈
從 Node-RED 0.17 版起
如果節點超過 15 秒沒有完成工作,會被視為逾時。整個運作將會繼續執行
記錄事件 Logging events
如果節點需要記錄東西到控制台(console),可以使用下列其中一個函數
this.log("Something happened");
this.warn("Something happened you should know about");
this.error("Oh no, something bad happened");
// 從 Node-RED 0.17 版起
this.trace("Log some internal detail not needed for normal operation");
this.debug("Log something more details for debugging the node's behaviour");
warn
跟 error
的記錄也會送到網頁編輯器的 debug 頁面
處理錯誤
如果發生需要中止當前流程的錯誤,應該要用 this.error
記錄起來
當錯誤是節點使用者要自行解決時,要把原始訊息(如果是輸入節點,可能為空訊息)當做第二個參數傳入
node.error("hit an error", msg);
This will trigger any Catch nodes present on the same tab.
這句話不太懂,需要實際驗證一下
設定狀態 Setting status
在執行時,節點可以把狀態顯示在網頁編輯器的 UI 上。這是透過呼叫 status
函數完成的
this.status({fill:"red",shape:"ring",text:"disconnected"});
更詳細的 status
API 可以看這裡
自定節點設定 Custom node setting
節點可能希望在使用者的 setting,js
公開設定選項
任何設定的名字,必須要遵守下列條件
- 名字的前面要有對應的節點類型
- 設定名字要使用駝峰命名法(camel-case),詳情見下文
- 節點不能要求使用者設定它,應該要有合理的預設值
舉例來說,一個節點類型 sample-node
想要公開 colour
這個設定,這設定名稱應該是 samepleNodeColour
在執行時,節點可以使用 RED.setting.sampleNodeColour
引用設定
對網頁編輯器公開設定 Exposing settings to the editor
從 Node-RED 0.17 版起
如果節點想要把設定公開在編輯器,應該要在註冊節點 registerType
時,把設定當做參數傳遞進去
RED.nodes.registerType("sample",SampleNode, {
settings: {
sampleNodeColour: {
value: "red",
exportable: true
}
}
});
value
設置著這設定的應該使用的預設值exportable
告訴編輯器可以使用這設定
As with the runtime, the node can then reference the setting as RED.settings.sampleNodeColour within the editor.
還不太懂,待理解
如果節點嘗試註冊不符合命名規則的設定名稱,會引發錯誤並且記錄