前回のエントリーで環境変数の学び直しをしたので、今回はNode-REDでの環境変数の使い方の復習をします。復習と言ってもほぼ使ったことがなかったので初めて使うに近いです。今回の内容は以下の内容を踏襲しています。サブフローなどに関してはまだ手に負えないので、記載はしていません。
公開されているこちらの情報ですが、非常にいい情報が掲載されているのですが、初心者には結構わかりにくいような😢その部分も含めてまとめて行きます。
今回、RaspberryPi OS環境に、以下のように起動したNode-REDをインストールして使っています。
環境変数の内容については前回のエントリのLinux系の環境変数の部分を参考にお願いします。
参考
また、今回参照する環境変数は変数名:ENV_VARIABLE、値:value123とします。
CLIによる設定と表示
# 設定(~/.bashrcなどの編集) $ export ENV_VARIABLE=value123 # 表示(grep使用) $ printenv | grep ENV_VARIABLE ENV_VARIABLE=value123
環境変数をNode-REDで使用する方法
1)ノードのプロパティに${環境変数名}の形式で設定し参照を行う
ノードのプロパティを文字列として${環境変数の名前}と入力する。今回は環境変数の名前がENV_VARIABLEなので${ENV_VARIABLE}となります。
プロパティの値が扱いやすいinjectノードのpayloadにこの値を入力したフローを作成します。

injectノードをダブルクリックし、【injectノードを編集】から【プロパティ】のmsg.payloadの値をプルダウンから文字列に設定し、テキストボックスに${ENV_VARIABLE}を入力します。

【デプロイ】ボタンをクリックして、フローを起動するとデバッグエリアに”value123”が表示されます。

この形式ではプロパティの値すべてが環境変数になる場合のみ使用ができます。環境変数と別の文字列が混在する場合には使用できないので注意してください。
2)ノードのプロパティの型形式を$ 環境変数に設定し参照を行う
続いての参照方法は、ノードのプロパティの型をプルダウンから$ 環境変数に設定し、環境変数名を設定する方法です。この型のプルダウンのあるUIをTypedInputウィジェットと呼ぶそうです。
フローとしては先程とほぼ代わりません。injectノードとdebugノードを使用します。

injectノードのTypedInputウィジェットの型を$ 環境変数に変更し、テキストボックスに環境変数名(今回はENV_VARIABLE)を入力します。

フローを実行すると値が参照できます。

この形式でもプロパティの値すべてが環境変数になる場合のみ使用ができます。
他にもこのようなTypedInputウィジェットが使用できるノードは以下のようなものがありました。
- injectノード
- changeノード
- switchノード
- write fileノード
- read fileノード
3)ノードのJSONata式で〇〇して設定し参照を行う
JSONata式を使用可能なノードでは、TypedInputウィジェットの型をJ: JSONata式に変更して、$env()関数を使用することによって、環境変数にアクセスすることができます。
JSONata式とは、JSON データ構造を照会および変換するための式言語です。
DBにおけるクエリのような形でデータの取得、変換などが行える様になっています。このJSONata式を使用して以下のように記述をします。
$env("ENV_VARIABLE")
フローとしては、JSONata式はinjectノードからも使用できるので、先程までのフロート全く代わりません。

injectノードのTypedInputウィジェットの型をJ: JSONata式に変更し、テキストボックスに$env("ENV_VARIABLE")を入力します。

フローを実行すると値が参照できます。

4)Functionノードのコードで環境変数を取得して使用する
Functionノードのコード記述では、環境変数はenv.get()関数を利用することによってアクセスすることができます。以下のコードでは変数valueに環境変数ENV_VARIABLEの内容を代入しています。以降、変数valueを使用したNode.jsの記述ができます(処理に使用することができます)。
let value = env.get("ENV_VARIABLE"); msg.payload = value; return msg;
injectノード、functionノード、debugノードを使用して以下の様なフローを作成し、

functionノードのコードに上記のコードを入力して、【デバック】ボタンをクリックします。・

これで環境変数の値の取得が行えました。

functionノードのコードに記載するので、色々な処理を組み合わせる事ができますし、出力結果も環境変数とは異なる値を出力できます。
5)templateノードのテキストボックスで環境変数を取得して参照(使用)を行う
Node-RED 3.0以降ではtemplateノードは次のようなのシンタックスで環境変数にアクセスすることができます。このシンタックスは{{が英語圏の顔文字の髭にみえることからmustache記法(マスタッシュはヒゲの意)と呼ばれています。
My ENV value is {{env.ENV_VARIABLE}}.
injectノード、templateノード、debugノードを使用して以下の様なフローを作成し、

templateノードのテンプレートに上記を入力して、【デプロイ】ボタンをクリックします。・

実行すると以下のような表示が行われます。

templeteノードのテンプレートに記載するので、出力結果の一部に環境変数を含める値を出力できます。
おわりに
今回はNode-REDで環境変数を使用する方法についていくつかのパターンを見てきました。パターンが多すぎなのではと思うのですが、
値の参照・取得しかできないパターン、処理も追加できるパターン、環境変数の値を出力に含めるパターンといった、3つぐらいに大別できるのかなと思います。
それら用途に合わせられれば、処理のパターン化分けは容易なのかもしれません。