global、flow、msg、payloadについて

大まかにですが、global、flow、msg、payloadという変数の種類について、最初使い方がわからなかった為、簡単ですが記載します。

  • globalオブジェクト

globalは、node-redの起動単位(ポート)にて、値が保持、維持されます。(コンテキストオブジェクト内のオブジェクト)その為、起動し、globalオブジェクトの変数として値を設定した場合、再起動しない限り、値が保持されています。私は毎日定時にサーバ再起動が必要だった為、それにあわせて、起動時のトリガーにより値を設定していました。内容としては、接続先や設定値など、システム全体に影響するような値を設定していました。また全てのノード(フロー、サブフロー)から参照が可能です。

※私はですが基本的にglobalオブジェクトは便利ですが、なるべく使わないようにしていました。単純にポートごとに別システム&別顧客の構成であれば、問題ないのですが、複数の業務システムを1ポートで構成する場合があり、global等のコンテキストレベルは、全てに影響を与える為、リストや影響の範囲が広くなります。その為、私は最低限でのみ使用していました。

  • flowオブジェクト

flowオブジェクトは、同一のタブ(フロー、サブフロー)単位で保持、維持されるオブジェクトです。私は基本的に使ったことがありません。その他のフローと連携することが多い為、msgオブジェクトの方が活用しやすい為ですが、具体的にそのフローでしか必要としない値などがあれば使えると思います。

  • msgオブジェクト

msgオブジェクトはその利便性から私は一番、使用します。別のフローには受け渡しによって経由される為、自由性が高く、コントロールしやすいです。出力をわけて別のmsgを受け渡しする事で、後方の処理(ノード)を分岐もできます。

  • payloadオブジェクト

payloadは、msg.payloadの要素となります。基本的にノードの結果が(SQLのデータ取得結果、RESTのGETのレスポンス等)が返却されるデフォルトになっています。その為、結果があるたびに、上書きされる為、後方の処理で再利用したい場合は、changeノードなどによって別のオブジェクトに値を退避しています。私はchangeノードばかりになって、視覚的にわかりにくくなった為、かっこ悪いですが、functionノードで、一旦、JSONを文字列化して、JSON化しなおして別の要素に格納することで、値渡しによる退避を行っていました。少なくとも注意が必要なのは、そのまま代入すると、参照渡しとなり、後方の処理でmsg.payloadが変わると、代入した変数値もかわってしまうという事にあります。