Node-REDでfunctionノードを使う
functionノード
functionノードは、msgに対してJSコードを記述することができます。
injectノードと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」と入力します。デプロイして実行します。
msg.nameが追加されています。
return null
とするとフローがその時点で終了するとの事。確かにデバッグが表示されませんでした。
一般論として、Functionノードはどんな変更をプロパティに行っても、 受け取ったメッセージオブジェクトを返すべきです。
functionノード内で新たなmsgオブジェクトを生成して返すことができるようですが、↑ドキュメントに記載の通り、あんまりしないほうが良いようです。
functionノード内でのデバッグ
functionノード内でデバッグするにのnode.warn()
メソッドを使用します。デバッグコンソールに表示されます。
node.jsのconsoleモジュールも使えますがこちらはシステムコンソールに出力されるようです。node.log()
メソッドもシステムコンソールに表示されてしまいました。この辺りは、どのOSを利用しているかとどのようにNode-REDを起動したかに依るそうです。
functionノードから複数出力
functionノードはデフォルトは出力数は1です。設定タブに出力数がありますが、これを2にすると複数出力することができます。
functionノードの出力が2つになっています。
functionノードのコードで戻り値を配列の要素にして返すとそれぞれの後続処理にメッセージが渡されます。
ちなみにこの出力数をコード内で使いたい場合は、node.outputCount
という変数を使用します。
1つの出力に複数メッセージを送る
1つの出力に複数メッセージを送るには、msgオブジェクトを要素とする1つの配列を返します。
return [[msg1,msg2,msg3],msg4];
1つの出力なのでdebugノードに[msg1,msg2,msg3]がシーケンシャルに渡されます。
初期化処理
初期化処理タブは、デプロイして起動時に1度だけ実行されます。
node.warn('start')
実行します。デプロイボタン押下とともに初期化処理が実行されます。
終了処理
終了処理タブは、Node-REDを停止した時、もしくは再デプロイした時に実行されます。
コンテキストに保存
contextはノードスコープのローカルなコンテキストで、このコンテキストにデータ保存することができます。
初期化処理タブに以下のように記述します。
if (context.get("counter") === undefined) { context.set("counter", 0) }
コードタブに以下のように記述します。
msg.counter = +context.get("counter")+1 // インクリメント context.set('counter',msg.counter); // contextにset return msg;
デプロイして実行します。実行するたびにインクリメントされます。
参考サイト
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント