MySQL
Ubuntu
vagrant
node-red

Node-RED入門 〜ローカルインストールからRESTful APIまで

More than 1 year has passed since last update.

Node-REDはIBM研究所が開発した直感的にアプリケーションを開発できるプラットフォームです。Bluemixでも簡単に利用できますが、ここではローカルマシンにNode-REDをインストールし、簡単なRESTful APIを作成します。Node-REDのプラグインをMySQLにデータを保存します。

本記事での最終的な構成は下記のようになります。

Screen Shot 2016-03-19 at 12.41.08.png

環境

  • 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です。

Screen Shot 2016-03-18 at 22.53.21.png

Hello World

Node-REDを利用してHello Worldを表示させます。次の手順でHello Worldを表示させるアプリをデプロイします。

  1. 左のNode一覧のinputからinject Node の追加
  2. 左のNode一覧のoutputからdebug Node の追加
  3. inject Node と debug Nodeをつなぐ
  4. inject Node の編集 - PayloadからStringを選び「Hello World」を入力
  5. デプロイ

Screen_Shot_2016-03-18_at_22_54_09.png

デプロイが完了したら、実際にinjectをクリックして「Hello World」を表示させます。

Screen_Shot_2016-03-18_at_23_01_40.png

ライブラリの追加

標準の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の設定を行っていきます。下記の手順でデータベースの設定画面を開きます。

Screen_Shot_2016-03-19_at_11_13_48.png

下記の情報を入力して「Add」を押します。これで保存されるので、このmysql nodeはひとまず消してしまって大丈夫です。

  • User: root
  • Password: [rootパスワード]
  • Database: nodered

RESTful API

以上で準備が整ったので、これからユーザ情報を保存、参照、変更、削除できるようなシンプルなAPIを作成してみます。

POST /users

ユーザの追加APIをつくります。下記のようにhttp node、function node、mysql node、http response nodeをおいて、それらをつなぎます。

Screen Shot 2016-03-19 at 11.19.27.png

ここから各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パラメータに任意の名前を入力してください。下記のようなレスポンスがあれば成功です。

Screen Shot 2016-03-19 at 11.29.01.png

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リクエストを送り下記のようなレスポンスがあれば成功です。

Screen Shot 2016-03-19 at 11.41.13.png

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パラメータに変更したい名前を入力してください。下記のようなレスポンスがあれば成功です。

Screen Shot 2016-03-19 at 11.44.11.png

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リクエストを送り下記のようなレスポンスがあれば成功です。

Screen Shot 2016-03-19 at 11.45.39.png

まとめ

簡単ですが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"]]}]