先日、Node.js + Express で作ったアプリケーションに Node-RED を組み込む機会がありましたので、その方法を紹介したいと思います。
Node-RED を触ったのは今回が初めてだったのですが、簡単に組み込むことができました。
また、せっかく組み込むことができたので、Node-RED を使って簡単な REST API を作成してみます。
バージョン
Ubuntu 22.04.3 LTS の中に全てをインストールしました。
- Ubuntu
22.04.3 LTS
※WSL2 を使用- Node.js
18.18.0
- Npm
9.6.7
- PostgreSQL
14.10
- Node-RED
3.1.3
- node-red-contrib-postgresql
0.14.0
- Express
4.18.2
- Node.js
Node-RED を組み込む
まず最初に、Node-RED
をインストールします。
npm install node-red
次に、Node-RED 日本ユーザ会のサイトで(ミニマムな構成の)ソースコードが掲載されているので、このソースコードを既存の Express アプリケーションに入れ込んでいきます。
既存アプリケーションへの組込み : Node-RED日本ユーザ会 (nodered.jp)
今回は、main.js
という空のファイルを作成し、main.js
に掲載されているソースコードを丸々コピーして、進めていきます。
main.js
にコピーしたら、1か所だけ変更を行います。
ソースコード中のuserDir:"/home/nol/.nodered/"
となっている箇所を、自分の環境の任意のディレクトリに変更しておきます。
userDir:"/home/nol/.nodered/"
変更が終わったら、アプリケーションを起動します。
node main.js
アプリケーションを起動したら、ブラウザで http://localhost:8000/red
にアクセスします。
"Node-RED へようこそ!"の表示を確認できたら、無事に組み込み完了となります。
ソースコード中に httpAdminRoot:"/red"
と記載しているため、http://localhost:8000/red
でアクセスします。
例えば、httpAdminRoot:"/node"
と記載した場合は http://localhost:8000/node
でアクセスします。
データベースとテーブルの作成
API を作り始める前に、データベースとテーブルを作成しておきます。
今回は hoge
というデータベースを作成し、hoge
ユーザで users
テーブルを作成しました。
CREATE TABLE users (id integer, name varchar(20));
ついでに、テストデータも登録しておきます。
INSERT INTO users(id,name) VALUES(1,'taro');
INSERT INTO users(id,name) VALUES(2,'hanako');
Node-RED でフローを作り始める前に、PostgreSQL と接続を行うための準備をしておきます。
Node-RED 画面右上のハンバーガーメニューから「パレットの管理」を選択します。
「ノードを追加」タブを選択して、"ノードを検索"と表示されている入力ボックスに node-red-contrib-postgresql と入力します。
結果が表示されたら「ノードを追加」をクリックします。
完了ダイアログが表示されたら「現在のノード」タブを選択して、node-red-contrib-postgresql が表示されていることを確認します。
これで準備は完了です。
API作成
今回は次のような API を作成します。
ソースコード中に httpNodeRoot: "/api"
と記載しているため、http://localhost:8000/api/xxx
でのアクセスとなります。
- (1) GET ※全件取得
- (2) GET ※1件取得
- (3) POST
- (4) PUT
- (5) DELETE
最初に「(1) GET ※全件取得」のフローから作成していきます。
画面左側のメニューにある「ネットワーク」の中から「http in」を選択して、フローエリアにドラッグ&ドロップして配置します。
配置した「http in」をダブルクリックして編集画面を開き、次のように入力します。入力が終わったら「完了」ボタンを押下します。
次に、画面左側のメニューにある「機能」の中から「function」を選択して、フローエリアにドラッグ&ドロップして配置します。
配置した「function」をダブルクリックして編集画面を開き、次のように入力します。入力が終わったら「完了」ボタンを押下します。
msg.payload
に実行したい SQL を記述しています。
次に、画面左側のメニューにある「ストレージ」の中から「postgresql」を選択して、フローエリアにドラッグ&ドロップして配置します。
配置した「postgresql」をダブルクリックして編集画面を開き、次のように入力します。入力が終わったら「完了」ボタンを押下します。
あらかじめ作成しておいたデータベースの情報を入力しています。
「Query」は function で定義した SQL を使いたいので、mustache 記法でこのように書きます。
最後に、画面左側のメニューにある「ネットワーク」の中から「http response」を選択して、フローエリアにドラッグ&ドロップして配置します。
これでノードの作成は完了です。
あとは、ノードを線で繋いでいき、繋ぎ終わったら「デプロイ」ボタンを押下します。
デプロイに成功すると「デプロイが成功しました」メッセージが表示されます。
デプロイが成功したら、curl
コマンドで http://localhost:8000/api/users
にアクセスしてみます。※ブラウザでもOKです。
事前に登録しておいたテストデータが取得できました。無事に動いているようです。
残りの (2) から (5) も同じ要領でフローを作成していきます。
それぞれの function ノードに記載するコードは次のようになります。
・(2) GET ※1件取得
パスパラメータで渡された id
の値は、msg.req.params.id
で参照可能です。
const id = msg.req.params.id;
msg.payload = `SELECT id,name FROM users WHERE id = ${id};`
return msg;
・(3) POST
リクエストボディで渡されたid
,name
の値は、msg.payload.id
,msg.payload.name
で参照可能です。
const {id, name} = msg.payload;
msg.payload = `INSERT INTO users(id,name) VALUES(${id}, '${name}');`
return msg;
(4) PUT
const id = msg.req.params.id;
const name = msg.payload.name;
msg.payload = `UPDATE users SET name = '${name}' WHERE id = ${id};`
return msg;
(5) DELETE
const id = msg.req.params.id;
msg.payload = `DELETE FROM users WHERE id = ${id};`
return msg;
最終的に完成したフローは次のようになります。
さいごに
Node-RED を初めて触ってみたのですが、ソースコードが公開されていたため、思っていたよりも簡単に組み込みできたように思います。
今回は、既存のアプリケーションに組み込む形で Node-RED を使用しましたが、Node-RED 単体での使用もできますので興味のある方は実際に試してみてください。
コンテナイメージがあるようなので、これを使うのが一番簡単だと思います。
なお、今回は下記のサイトを参考にさせていただきました。(ほとんど、このサイトの内容をなぞった感じになっております)
https://qiita.com/noralife/items/4c9b975e9d1d664720a0