Node-REDはIBM研究所が開発した直感的にアプリケーションを開発できるプラットフォームです。Bluemixでも簡単に利用できますが、ここではローカルマシンにNode-REDをインストールし、簡単なRESTful APIを作成します。Node-REDのプラグインをMySQLにデータを保存します。
本記事での最終的な構成は下記のようになります。
環境
- Ubuntu 14.04.4 LTS
- Node.js v0.10.37
- Node-RED v0.13.3
以下のVagrantfile
を使っています。
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.hostname = "ubuntu"
config.vm.network "private_network", ip: "192.168.11.118"
config.vm.provision "shell", inline: <<-SHELL
apt-get update
SHELL
end
インストール
サーバにログインし、Node.jsをインストールします。
$ vagrant up
$ vagrant ssh
vagrant@ubuntu:~$ sudo add-apt-repository ppa:chris-lea/node.js
[Enter]
vagrant@ubuntu:~$ sudo apt-get update
vagrant@ubuntu:~$ sudo apt-get install -y nodejs
Node.jsがインストールできたら、Node-REDをインストールします。
vagrant@ubuntu:~$ sudo npm install -g node-red
インストールが完了したら、Node-REDを起動します。
vagrant@ubuntu:~$ node-red
ブラウザから http://192.168.11.118:1880/
にアクセスして下記のような画面がでればOKです。
Hello World
Node-REDを利用してHello Worldを表示させます。次の手順でHello Worldを表示させるアプリをデプロイします。
- 左のNode一覧のinputからinject Node の追加
- 左のNode一覧のoutputからdebug Node の追加
- inject Node と debug Nodeをつなぐ
- inject Node の編集 - PayloadからStringを選び「Hello World」を入力
- デプロイ
デプロイが完了したら、実際にinjectをクリックして「Hello World」を表示させます。
ライブラリの追加
標準のNodeでも様々なことができますが、標準のNodeでやりたいことができない場合があります。その場合でも、600を超えるライブラリが公開されているので、それらを活用することができます。
ここではMySQLにユーザデータを保存するため、node-red-node-mysqlをインストールします。
MySQLのインストールとデータベース、テーブルの作成
vagrant@ubuntu:~$ sudo apt-get install -y mysql-server
[rootパスワードの入力]
vagrant@ubuntu:~$ mysql -uroot -p
Enter password: [rootパスワードの入力]
mysql> CREATE DATABASE nodered;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TABLE nodered.users(id INT AUTO_INCREMENT, name TEXT, PRIMARY KEY (id));
Query OK, 0 rows affected (0.01 sec)
ライブラリのインストール
vagrant@ubuntu:~$ cd ~/.node-red/
vagrant@ubuntu:~/.node-red$ npm install node-red-node-mysql
node-red-node-mysql@0.0.8 node_modules/node-red-node-mysql
└── mysql@2.9.0 (bignumber.js@2.0.7, readable-stream@1.1.13)
vagrant@ubuntu:~/.node-red$ node-red
データベースの追加
node-redを起動するとstorageの欄にmysqlが増えていると思います。ここからMySQLの設定を行っていきます。下記の手順でデータベースの設定画面を開きます。
下記の情報を入力して「Add」を押します。これで保存されるので、このmysql nodeはひとまず消してしまって大丈夫です。
- User: root
- Password: [rootパスワード]
- Database: nodered
RESTful API
以上で準備が整ったので、これからユーザ情報を保存、参照、変更、削除できるようなシンプルなAPIを作成してみます。
POST /users
ユーザの追加APIをつくります。下記のようにhttp node、function node、mysql node、http response nodeをおいて、それらをつなぎます。
ここから各nodeの設定を行っていきます。
http nodeの設定
- Method: POST
- URL: /users
function nodeの設定
- Name: Generage SQL
- Function:
name = msg.payload.name;
msg.topic = "insert into users(name) values('" + name + "');";
console.log(msg.topic);
return msg;
mysql nodeの設定
- Database: nodered
動作確認
nodeの設定が終わったらデプロイボタンを押します。POSTMAN等でhttp://192.168.11.118:1880/users
にPOSTリクエストを送ります。name
パラメータに任意の名前を入力してください。下記のようなレスポンスがあれば成功です。
GET /users
ユーザ一覧を表示するAPIをつくります。POSTの際と同様のnodeを配置し、線でつないでください。各nodeには下記のように設定を入れます。
http nodeの設定
- Method: GET
- URL: /users
function nodeの設定
- Name: Generage SQL
- Function:
msg.topic = "SELECT * FROM users;"
console.log(msg.topic);
return msg;
mysql nodeの設定
- Database: nodered
動作確認
nodeの設定が終わったらデプロイボタンを押します。POSTMAN等でhttp://192.168.11.118:1880/users
にGETリクエストを送り下記のようなレスポンスがあれば成功です。
PUT /users/:userid
ユーザ情報を更新するAPIをつくります。POSTの際と同様のnodeを配置し、線でつないでください。各nodeには下記のように設定を入れます。
http nodeの設定
- Method: PUT
- URL: /users/:userid
function nodeの設定
- Name: Generage SQL
- Function:
id = msg.req.params.userid;
name = msg.payload.name;
msg.topic = "UPDATE users SET name='" + name + "' WHERE id=" + id + ";";
console.log(msg.topic);
return msg;
mysql nodeの設定
- Database: nodered
動作確認
nodeの設定が終わったらデプロイボタンを押します。POSTMAN等でhttp://192.168.11.118:1880/users/[userid]
にPUTリクエストを送ります。name
パラメータに変更したい名前を入力してください。下記のようなレスポンスがあれば成功です。
DELETE /users/:userid
ユーザ情報を削除するAPIをつくります。POSTの際と同様のnodeを配置し、線でつないでください。各nodeには下記のように設定を入れます。
http nodeの設定
- Method: DELETE
- URL: /users/:userid
function nodeの設定
- Name: Generage SQL
- Function:
id = msg.req.params.userid;
msg.topic = "DELETE FROM users WHERE id=" + id + ";";
console.log(msg.topic);
return msg;
mysql nodeの設定
- Database: nodered
動作確認
nodeの設定が終わったらデプロイボタンを押します。POSTMAN等でhttp://192.168.11.118:1880/users/[userid]
にDELETEリクエストを送り下記のようなレスポンスがあれば成功です。
まとめ
簡単ですがNode-REDのインストールと使い方を説明しました。
これより先は下記サイトが参考になります。
参考
次のJSONファイルをインポートすることで、上記を再現することができます。
[{"id":"1fd3dfa8.4f1d4","type":"MySQLdatabase","z":"4aa5ae1.97e3a5","host":"127.0.0.1","port":"3306","db":"nodered","tz":""},{"id":"2650d5a5.c197ba","type":"inject","z":"4aa5ae1.97e3a5","name":"","topic":"","payload":"Hello World","payloadType":"str","repeat":"","crontab":"","once":false,"x":152.5,"y":36,"wires":[["70e93a18.c280e4"]]},{"id":"70e93a18.c280e4","type":"debug","z":"4aa5ae1.97e3a5","name":"","active":true,"console":"false","complete":"false","x":448.5,"y":76,"wires":[]},{"id":"ea332de7.8bb8e","type":"http in","z":"4aa5ae1.97e3a5","name":"","url":"/users","method":"post","swaggerDoc":"","x":123.5,"y":130,"wires":[["820ba42e.202538"]]},{"id":"820ba42e.202538","type":"function","z":"4aa5ae1.97e3a5","name":"Generate SQL","func":"name = msg.payload.name;\n\nmsg.topic = \"insert into users(name) values('\" + name + \"');\";\nconsole.log(msg.topic);\n\nreturn msg;","outputs":1,"noerr":0,"x":247.5,"y":186,"wires":[["a559edc7.2808f"]]},{"id":"a559edc7.2808f","type":"mysql","z":"4aa5ae1.97e3a5","mydb":"1fd3dfa8.4f1d4","name":"","x":411.5,"y":145,"wires":[["46a723fa.395a7c"]]},{"id":"46a723fa.395a7c","type":"http response","z":"4aa5ae1.97e3a5","name":"","x":565.5,"y":188,"wires":[]},{"id":"ce257e44.bad9d","type":"http in","z":"4aa5ae1.97e3a5","name":"","url":"/users","method":"get","swaggerDoc":"","x":108,"y":254,"wires":[["76258633.ef0118"]]},{"id":"76258633.ef0118","type":"function","z":"4aa5ae1.97e3a5","name":"Generate SQL","func":"msg.topic = \"SELECT * FROM users;\"\nconsole.log(msg.topic);\n\nreturn msg;","outputs":1,"noerr":0,"x":236.5,"y":315,"wires":[["caefba35.3d99e8"]]},{"id":"caefba35.3d99e8","type":"mysql","z":"4aa5ae1.97e3a5","mydb":"1fd3dfa8.4f1d4","name":"","x":413.5,"y":264,"wires":[["4bdf356f.248bec"]]},{"id":"4bdf356f.248bec","type":"http response","z":"4aa5ae1.97e3a5","name":"","x":566.5,"y":316,"wires":[]},{"id":"757294dd.b521cc","type":"http in","z":"4aa5ae1.97e3a5","name":"","url":"/users/:userid","method":"delete","swaggerDoc":"","x":142,"y":503,"wires":[["664ff4ec.bc50dc"]]},{"id":"664ff4ec.bc50dc","type":"function","z":"4aa5ae1.97e3a5","name":"Generate SQL","func":"id = msg.req.params.userid;\nmsg.topic = \"DELETE FROM users WHERE id=\" + id + \";\";\nconsole.log(msg.topic);\n\nreturn msg;","outputs":1,"noerr":0,"x":234.5,"y":566,"wires":[["7ea3cf0c.e6a39"]]},{"id":"7ea3cf0c.e6a39","type":"mysql","z":"4aa5ae1.97e3a5","mydb":"1fd3dfa8.4f1d4","name":"","x":413.5,"y":503,"wires":[["9fd59e08.8c24e"]]},{"id":"9fd59e08.8c24e","type":"http response","z":"4aa5ae1.97e3a5","name":"","x":555.5,"y":555,"wires":[]},{"id":"9db59cca.00b8d","type":"http in","z":"4aa5ae1.97e3a5","name":"","url":"/users/:userid","method":"put","swaggerDoc":"","x":130.5,"y":380,"wires":[["fa69f9c7.2493b8"]]},{"id":"fa69f9c7.2493b8","type":"function","z":"4aa5ae1.97e3a5","name":"Generate SQL","func":"id = msg.req.params.userid;\nname = msg.payload.name;\nmsg.topic = \"UPDATE users SET name='\" + name + \"' WHERE id=\" + id + \";\";\nconsole.log(msg.topic);\nreturn msg;","outputs":1,"noerr":0,"x":234.5,"y":435,"wires":[["2321636c.fffb6c"]]},{"id":"fdc0c758.f91438","type":"http response","z":"4aa5ae1.97e3a5","name":"","x":560.5,"y":435,"wires":[]},{"id":"2321636c.fffb6c","type":"mysql","z":"4aa5ae1.97e3a5","mydb":"1fd3dfa8.4f1d4","name":"","x":409.5,"y":389,"wires":[["fdc0c758.f91438"]]}]