node-red

Changeノードを制すものがNode-REDを制す

More than 1 year has passed since last update.


概要

タイトルは大げさですが、Node-REDを使ってると大半がJSONのプロパティをゴニョゴニョすることが多いため、Changeノードを使い倒すことで極力コーディングを減らすことが解りやすく再利用しやすいFlowを作るコツだと思います。


Flowを流れるデータの理解

念のためFlowを流れるデータを理解するため復習しておきます。

まずは、Injectノードを置いて以下のようにmsg.payloadに"ペイロード"という文字列が流れるように設定します。

image

次にDebugノードを置いて以下のようにOutputをcomplete msg objectを選択します。

image

2つのノードをつないでワイヤーでつないでInjectノードのスイッチをクリックすると以下のようにDebugにmsg全体の内容が表示されます。

image

これでFlowを流れるデータが基本的に以下のような構造になっていることが理解できます。

image


Changeノードの"Set"を理解する

続いて以下のようにInjectノードとDebugノードの中間にChangeノードを配置します。

image

次にChangeノードを以下のように設定します。

image

これを実行すると以下のようにmsg.payloadの内容が"ペイロード"という文字列から"ペイロール"という文字列に書き換わりました。

image

つまり、Changeノードの"Set"とは以下のようなことですね。

image

試しに以下のようにするとmsg._msgidの値がmsg.payloadにコピーされます。

image

コピーされました。

image

新しいプロパティを作成することも可能です。以下のように設定してみてください。

image

以下のように新しくmsg.new_propertyというプロパティにmsg.payloadの値である"ペイロード"という文字列が入っています。

image


Changeノードの"Move"を理解する

上記の通り"Set"はコピーでしたがコピー元の値を残したくない場合は"Move"を使います。ただ、ややこしいのが移動元と先が上下反転することです(これが正しいかどうかはよくわかりません)

image

以下のようにコピー元(msg.payload)が消滅し移動先に移ります。

image


Changeノードの"Change"を理解する

次に"Change"です。以下のように設定します。

image

すると、対象のプロパティの値を置き換える感じです。要はreplaceですね。

image

デフォルトで再帰的な置き換えのようです。

image


Changeノードの"Delete"を理解する

次に"Delete"ですが以下のように設定します。

image

すると指定したプロパティが消滅します。

image


複数ルールを理解する

以下のように"Set"設定をします。

image

msg.aaa.bbbプロパティへ値がコピーされました。

image

続いて以下のように"Change"設定のノードを後続置きます。

image

"Change"の設定は以下です。

image

これを実行すると以下のように"Set"設定のノードだけを通過した結果と"Change"設定のノードも通過した結果の2つが得られます。

image

各ノードを通過したデータが欲しい場合は上記のようにしますが"Set"して"Change"したものだけが欲しい場合は以下のようにまとめて設定します。

image

処理の順序は設定上でルール設定している上から下の順に実行されますので以下のような結果になります。

image


まとめ

Changeノードを使えばデータ変換の多くのことは実現できると思います。Functionノードでプロパティの操作や文字列操作をするケースが発生したら、まずChangeノードで実現できないか試みるようにしてみるとFlowからコーディングが劇的に減ると思います。是非、Changeノードを使い倒して極力コーディングしないFlowを作ってみてください!


おまけ

プロパティ操作ができるのはmsgだけでなく以下のようにflowglobalも可能です。

image