Node-REDでfunctionノードを使う

Node-REDでfunctionノードを使う

functionノード

functionノードは、msgに対してJSコードを記述することができます。

Node-REDでfunctionノードを使う

injectノードとfunctionノードをワイヤーでつなぎ、最後にとデバッグノードを配置します。

Node-REDでfunctionノードを使う

functionノードでmsg.nameを追加して、return msg;しています。msgオブジェクトを返すのが基本です。文字列を返すとFunction tried to send a message of type stringエラーとなります。

msg.name = 'takahashi'
return msg;

injectノードは配置するとタイムスタンプになるので、今回は文字列に変更してmsg.payloadに「test」と入力します。デプロイして実行します。

Node-REDでfunctionノードを使う

msg.nameが追加されています。

return nullとするとフローがその時点で終了するとの事。確かにデバッグが表示されませんでした。

一般論として、Functionノードはどんな変更をプロパティに行っても、 受け取ったメッセージオブジェクトを返すべきです。

functionノード内で新たなmsgオブジェクトを生成して返すことができるようですが、↑ドキュメントに記載の通り、あんまりしないほうが良いようです。

functionノード内でのデバッグ

functionノード内でデバッグするにのnode.warn()メソッドを使用します。デバッグコンソールに表示されます。

node.jsのconsoleモジュールも使えますがこちらはシステムコンソールに出力されるようです。node.log()メソッドもシステムコンソールに表示されてしまいました。この辺りは、どのOSを利用しているかとどのようにNode-REDを起動したかに依るそうです。

Node-REDでfunctionノードを使う

functionノードから複数出力

functionノードはデフォルトは出力数は1です。設定タブに出力数がありますが、これを2にすると複数出力することができます。

Node-REDでfunctionノードを使う

functionノードの出力が2つになっています。

Node-REDでfunctionノードを使う

functionノードのコードで戻り値を配列の要素にして返すとそれぞれの後続処理にメッセージが渡されます。

Node-REDでfunctionノードを使う

ちなみにこの出力数をコード内で使いたい場合は、node.outputCountという変数を使用します。

1つの出力に複数メッセージを送る

1つの出力に複数メッセージを送るには、msgオブジェクトを要素とする1つの配列を返します。

return [[msg1,msg2,msg3],msg4];

Node-REDでfunctionノードを使う

1つの出力なのでdebugノードに[msg1,msg2,msg3]がシーケンシャルに渡されます。

初期化処理

初期化処理タブは、デプロイして起動時に1度だけ実行されます。

node.warn('start')

Node-REDでfunctionノードを使う

実行します。デプロイボタン押下とともに初期化処理が実行されます。

Node-REDでfunctionノードを使う

終了処理

終了処理タブは、Node-REDを停止した時、もしくは再デプロイした時に実行されます。

Node-REDでfunctionノードを使う

コンテキストに保存

contextはノードスコープのローカルなコンテキストで、このコンテキストにデータ保存することができます。

初期化処理タブに以下のように記述します。

if (context.get("counter") === undefined) {
  context.set("counter", 0)
}

Node-REDでfunctionノードを使う

コードタブに以下のように記述します。

msg.counter = +context.get("counter")+1 // インクリメント
  context.set('counter',msg.counter); // contextにset
return msg;

Node-REDでfunctionノードを使う

デプロイして実行します。実行するたびにインクリメントされます。

Node-REDでfunctionノードを使う

参考サイト

コアノード : Node-RED日本ユーザ会
Functionノードの書き方 : Node-RED日本ユーザ会
コンテキストを利用する : Node-RED日本ユーザ会

コメント

タイトルとURLをコピーしました