前回までで手元のNode-RED環境のパレットにあるノードをひとわたり触れたことになりました。これからはも少し「掘ったり」「新たなノードを追加」したりしてみたいと思います。まずは何でもできる function ノード、も少し詳しくなりたいです。今回はrequire(‘xxx’)的に外部モジュールを呼び出したいです。
※「ブロックを積みながら」投稿順 index はこちら
function ノードは、グラフィックエディタ上で箱(ノード)を接続していけばいろいろできてしまうNode-REDの中において異分子とも言えます。中身にJavaScriptのコードを書かないとピクリとも動かないので。その代わり Node-REDの裏側で動いている node.js で出来ることは多分大抵のことができる筈。今回は、node-js上でスクリプトを動かすときに require(‘xxx’) xxxはモジュール名、とすれば使えるような機能をNode-REDのfunctionノード内で使ってみることを試みたいと思います。
Node-REDのfunctionノードの解説ページが以下に
今回は上記のページの以下の小見出しの部分を実験してみました。
Using the functionGlobalContext option
Settings.js
Node-REDのSettings.jsには、functionGlobalContextというプロパティが存在し、そこにrequire()すべきモジュールとそれを呼び出すためのプロパティを追加しておくと、functionノード内でglobalコンテキストから呼び出せるようです。
settings.jsは手元環境では以下にあります。
~/.node-red/settings.js
デフォルトでは、冒頭のアイキャッチ画像に掲げたとおり、内部にコメントアウトされた「例」があるだけです。最初の例は、node.js の標準モジュールである os モジュールを呼び出す例と思われたので、そこのコメントを外して生かしてみました。こんな感じ。
ここでNode-REDにsettings.jsを再読み込みしてもらえれば上記が生きてる筈。なお、node.js のOSモジュールのAPIについてのドキュメントは以下に。
Node.js v18.9.0 documentation >> api >> os
上記にごちゃまんとあるAPIが皆使えるのかと思うと嬉しい限り。
今回実験に使用したフロー
フローは以下のようです。
-
- Injectノード、トリガをかけるためのmsgを送出するだけ(中身はなんでもよい)
- functionノード、globalコンテキストからosモジュールを呼び出す。ここではとりあえずos.type()を調べて msg.payloadに載せる
- debugノード、送られてきた msg をデバッグウインドウに表示
肝心のfunctionノードの設定が以下に。
実験結果
msg.payloadには “Linux” が載っております。ちゃんと os.type()動いているようです。
次は自前でモジュール作っておいてロードか?いろいろ野望が広がるけれども。