Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
32
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

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

概要

タイトルは大げさですが、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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
32
Help us understand the problem. What are the problem?