3
0
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

Node.js + Express で作ったアプリケーションに Node-RED を組み込んでみた話

Posted at

先日、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-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/" となっている箇所を、自分の環境の任意のディレクトリに変更しておきます。

ソースコードの18行目辺り
userDir:"/home/nol/.nodered/"

変更が終わったら、アプリケーションを起動します。

node main.js

アプリケーションを起動したら、ブラウザで http://localhost:8000/red にアクセスします。
"Node-RED へようこそ!"の表示を確認できたら、無事に組み込み完了となります。

image.png

ソースコード中に httpAdminRoot:"/red" と記載しているため、http://localhost:8000/red でアクセスします。
例えば、httpAdminRoot:"/node" と記載した場合は http://localhost:8000/node でアクセスします。

データベースとテーブルの作成

API を作り始める前に、データベースとテーブルを作成しておきます。
今回は hoge というデータベースを作成し、hoge ユーザで users テーブルを作成しました。

CREATE TABLE users (id integer, name varchar(20));

image.png

ついでに、テストデータも登録しておきます。

INSERT INTO users(id,name) VALUES(1,'taro');
INSERT INTO users(id,name) VALUES(2,'hanako');

image.png

Node-RED でフローを作り始める前に、PostgreSQL と接続を行うための準備をしておきます。

Node-RED 画面右上のハンバーガーメニューから「パレットの管理」を選択します。
image.png

「ノードを追加」タブを選択して、"ノードを検索"と表示されている入力ボックスに node-red-contrib-postgresql と入力します。
結果が表示されたら「ノードを追加」をクリックします。
image.png

ダイアログが表示されたら「追加」をクリックします。
image.png

しばらく待つと完了ダイアログが表示されます。
image.png

完了ダイアログが表示されたら「現在のノード」タブを選択して、node-red-contrib-postgresql が表示されていることを確認します。
image.png

これで準備は完了です。

API作成

今回は次のような API を作成します。

ソースコード中に httpNodeRoot: "/api" と記載しているため、http://localhost:8000/api/xxx でのアクセスとなります。

最初に「(1) GET ※全件取得」のフローから作成していきます。

画面左側のメニューにある「ネットワーク」の中から「http in」を選択して、フローエリアにドラッグ&ドロップして配置します。
image.png

配置した「http in」をダブルクリックして編集画面を開き、次のように入力します。入力が終わったら「完了」ボタンを押下します。
image.png

次に、画面左側のメニューにある「機能」の中から「function」を選択して、フローエリアにドラッグ&ドロップして配置します。
image.png

配置した「function」をダブルクリックして編集画面を開き、次のように入力します。入力が終わったら「完了」ボタンを押下します。
msg.payload に実行したい SQL を記述しています。
image.png

次に、画面左側のメニューにある「ストレージ」の中から「postgresql」を選択して、フローエリアにドラッグ&ドロップして配置します。
image.png

配置した「postgresql」をダブルクリックして編集画面を開き、次のように入力します。入力が終わったら「完了」ボタンを押下します。
あらかじめ作成しておいたデータベースの情報を入力しています。

image.png
image.png
image.png
「Query」は function で定義した SQL を使いたいので、mustache 記法でこのように書きます。
image.png

最後に、画面左側のメニューにある「ネットワーク」の中から「http response」を選択して、フローエリアにドラッグ&ドロップして配置します。
image.png

これでノードの作成は完了です。
あとは、ノードを線で繋いでいき、繋ぎ終わったら「デプロイ」ボタンを押下します。
image.png

デプロイに成功すると「デプロイが成功しました」メッセージが表示されます。
image.png

デプロイが成功したら、curlコマンドで http://localhost:8000/api/users にアクセスしてみます。※ブラウザでもOKです。

事前に登録しておいたテストデータが取得できました。無事に動いているようです。
image.png

残りの (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;

最終的に完成したフローは次のようになります。

image.png

さいごに

Node-RED を初めて触ってみたのですが、ソースコードが公開されていたため、思っていたよりも簡単に組み込みできたように思います。

今回は、既存のアプリケーションに組み込む形で Node-RED を使用しましたが、Node-RED 単体での使用もできますので興味のある方は実際に試してみてください。
コンテナイメージがあるようなので、これを使うのが一番簡単だと思います。

なお、今回は下記のサイトを参考にさせていただきました。(ほとんど、このサイトの内容をなぞった感じになっております)
https://qiita.com/noralife/items/4c9b975e9d1d664720a0

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0