節點的 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");

warnerror 的記錄也會送到網頁編輯器的 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.

還不太懂,待理解

如果節點嘗試註冊不符合命名規則的設定名稱,會引發錯誤並且記錄

results matching ""

    No results matching ""