Functionノードを使う(その3)
今回も、前回に引き続きFunctionノードのサンプルフローを見つつざっとその機能を把握してみます。第三回です。
コンテキストにデータを保存
最初のサンプルは「06 - Storing data in context」です。コンテキストにデータを保存するらしいです。この時点でだいたい予想はついたので中身は見なくてもいいかと思いましたが、さすがに雑だと思ったので一応見ますです。Functionノードのプロパティはこんな感じ。
何回か実行すると、ログ上で数値がインクリメントされて出力されます。context上の'count'という名前の変数を使って、実行のたびに値を読み出し、インクリメント、値を保存しています。通常、フローは一回実行したら実行結果は消えてしまいますが、contextに保存して次回実行時に参照しているということですね。ステートフルな作りになってしまうので、バグの温床になりかねませんが、きっと必要な場面もあるはずです。コンテキストについてのドキュメントはこちら。コンテキストはデフォルトでメモリ上に保存されるので、Node-REDを再起動したら消えるってことですね。
ステータスの表示
次のサンプルは「07 - Showing status information」です。フローはこんな感じ。
injectノードではmsg.playloadに「red」という文字列を設定しています。
Functionノードではmsg.payloadの値でswitchして、node.status()関数でステータスを更新しているようです。あとはこの辺読んで感じ取れってことですね。
外部モジュールの利用
次のサンプルは「08 - Using external modules」です。このままフローを実行してもエラーが出て動きません。commentノードの詳細を見ろとあるので確認してみます。
setting.jsに以下のように書いて「os」モジュールを読み込めば良いようです。
functionGlobalContext: { os: require("os"), }
~/.node-red/settings.jsを確認するとちょうどこれと同じ記述がコメントアウトされているので、コメント部分を外して有効化します。Node-REDを再起動後にサンプルフローを実行すると、今度はログにそれっぽいOSの情報が出力されます。つまり、settings.jsで外部モジュールを読み込むrequire()を実行しておけば、Functionノードでそれを利用できるということのようです。
ということは、npmでインストールした任意のモジュールも利用できるということです。試しにHTTPクライアントモジュール「axios」をインストールしてFunctionノードで使ってみます。
$ npm install axios
settings.jsは以下のように、先ほどコメントアウトを外した箇所のすぐ下でaxiosをrequire()します。
functionGlobalContext: { os: require("os"), axios: require("axios"), }
続いてFunctionノードのプロパティに以下のように書いて適当なURLにGETでアクセスします。しれっとawaitを使ってみましたが、async句もないのにこんなんで動くのだろうか。
動いたー。どうしよう。Functionノードの全能感ハンパねぇ。
とりあえずまとめ
いろいろなノードの使い方を覚えるのをやめてFunctionノードでコード実装した方が早い気がしてきました。なーんてことは口が裂けても言えません。いや、適材適所ということで使い分ければいいんじゃないですかね。Node-REDいいと思います。サンプルはあと2つ!もう少し続きます。
コメント
コメントを投稿