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


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

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

![Screen Shot 2016-03-19 at 12.41.08.png](https://qiita-image-store.s3.amazonaws.com/0/27509/7b608065-59fc-053b-24b4-f6445a9ed034.png "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](https://qiita-image-store.s3.amazonaws.com/0/27509/6aacf0d0-20e9-4246-6367-988d7d1ad541.png "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](https://qiita-image-store.s3.amazonaws.com/0/27509/7bb754fc-d244-5b4f-ed92-305f58a7ed1d.png "Screen_Shot_2016-03-18_at_22_54_09.png")


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

![Screen_Shot_2016-03-18_at_23_01_40.png](https://qiita-image-store.s3.amazonaws.com/0/27509/fc9319a1-8a63-99d1-a515-60e11f0927d1.png "Screen_Shot_2016-03-18_at_23_01_40.png")

## ライブラリの追加

標準のNodeでも様々なことができますが、標準のNodeでやりたいことができない場合があります。その場合でも、600を超えるライブラリが公開されているので、それらを活用することができます。

ここではMySQLにユーザデータを保存するため、[node-red-node-mysql](http://flows.nodered.org/node/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](https://qiita-image-store.s3.amazonaws.com/0/27509/aad19f3a-b26b-3e52-ac95-5d1dc67abfee.png 
"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](https://qiita-image-store.s3.amazonaws.com/0/27509/589cb88d-a794-fd74-4570-9abc0ff6cdeb.png "Screen Shot 2016-03-19 at 11.19.27.png")

ここから各nodeの設定を行っていきます。

#### http nodeの設定

* Method: POST
* URL: /users

#### function nodeの設定

* Name: Generage SQL
* Function:

```javascript
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](https://qiita-image-store.s3.amazonaws.com/0/27509/29f07720-c9f3-d684-47cc-ee304b6b065f.png "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:

```javascript
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](https://qiita-image-store.s3.amazonaws.com/0/27509/04b68069-a2f7-40ee-7a17-bdffe9e91bc2.png "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:

```javascript
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](https://qiita-image-store.s3.amazonaws.com/0/27509/03fc9e3d-5463-00f1-42b4-6d0810651753.png "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:

```javascript
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](https://qiita-image-store.s3.amazonaws.com/0/27509/f9d2484c-c980-d6ca-36b6-064e3cd0cbfe.png "Screen Shot 2016-03-19 at 11.45.39.png")

## まとめ

簡単ですがNode-REDのインストールと使い方を説明しました。
これより先は下記サイトが参考になります。

* http://qiita.com/advent-calendar/2015/nodered
* http://eventdots.jp/eventreport/569762

## 参考

次の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"]]}]
```