Node-REDを使ってノーコーディングでLINE botを作ってみよう!! (07_Node-REDとCloudantDBを連携させよう)

#はじめに
Node-REDを使ってLINE botを作る記事は調べればでてきますが、最初から最後までノーコーディングで作成している記事はなかったのでここで解説していこうと思います。

データの内容からなるべく詳細に記載しようと思うので、必要な部分のみ参考にして下さい。

当該記事はNode-REDとCloudantDBの連携についてのみになります。
以下目次のリンクより必要記事にアクセスして下さい。

#目次
[01_環境構築編](https://qiita.com/VulpeS404/items/da196c87541b6af9214c)
[02_基礎編～LINE bot作成におけるNode-REDのデータの流れ～](https://qiita.com/VulpeS404/items/ee9e719f37ae535571fd)
[03_Node-REDからbotユーザーにメッセージを送信しよう](https://qiita.com/VulpeS404/items/c2e0db947db1b4c6229c)
[04_オウム返しbotをつくろう](https://qiita.com/VulpeS404/items/640b075b0a9eaaad249f)
[05_LINEから受信したデータの詳細を見てみよう](https://qiita.com/VulpeS404/items/554119209a4469130b98)
[06_ユーザーから送られたメッセージを判定して返事を返そう](https://qiita.com/VulpeS404/items/308f599660a79d2c457e)
[07_Node-REDとCloudantDBを連携させよう](https://qiita.com/VulpeS404/items/0d73963177d5829bc5a9)
08_ユーザーとやりとりできるbotをつくろう
09_おすすめの〇〇を紹介するbotをつくろう
[99_各nodeの解説まとめ](https://qiita.com/VulpeS404/items/0ce3057451d18f4d87ec)

#7. Node-REDとCloudantDBを連携させよう概要
前回まででNode-REDとLINEのやり取りに関する必要知識は解説しました。
しかし前回までの段階ですと、どれだけパターンを増やしてもなにか送られてきたものに対して返信するだけでやり取りはできません。
そこで今段階で何番目のやり取りをしていて、何番目のやり取りに対する判定をしたいのかを判別するためにやり取りのステータスを管理しなければなりません。
このステータス管理を今回はデータベース(以下DB)を使って実践しようと思います。

ステータス管理だけならDB使わずとも別途変数の箱で管理すれば良いのでは？と思う方もいらっしゃるとおもいます。
それに関してはその通りで変数管理でも実装は可能です。

ではなぜDBを使うかといいますと、「Node-REDを使ってノーコーディングでLINE botを作ってみよう!!」シリーズではDB必須の規模のLINE botを作る想定がないからです。
今回のテーマ的に必須ではないものの、返答パターンややり取りの多いbotを作ろうとするとDBの必要性を感じるようになります。
その時の為に、このステータス管理という題材で、この記事ではDB連携を説明しておこうというのが理由になります。

本記事は以下の順番で解説していこうと思います。
1．CloudantDBの準備
2．Node-REDの設定最終形
3．CloudantDBからのデータ取得について
4．CloudantDBへのデータの書き込みについて

#7-1. CloudantDBの準備
まずはDBとして利用するCloudantDBの準備をしていきましょう。
CloudantDBはIBM Cloudを利用すれば無料で、簡単に使うことができます。
基本的にNode-REDの環境構築時にCloudantDBとの接続設定もされています。

念のため接続されているか確認してみましょう。
それでは"リソースリスト>Apps>{{リソース名}}"をクリックしてリソースの詳細画面にいきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/b4e04336-840c-5642-923d-0fef321c1014.png)

左下のサービスの部分にCloudantでダッシュボードを開くがあれば接続はされています。
ここをクリックするとCloudantの詳細に飛びます。
![スクリーンショット (1364).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/c973e443-905e-fcd5-8207-c5fab884c6c7.png)

Cloudantのダッシュボードへの接続方法は上記のみでなく、"リソースリスト>サービスおよびソフトウェア"の中に{{リソース名}}-cloudant-{{ID}}といった形で存在するので、それをクリックしてもいけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/b1cfcab5-c8b1-1f55-cb18-4984661ae741.png)

Cloudantのページにいったら、右上の"Launch Dashboard"をクリックしましょう。
![スクリーンショット (1365).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/2cf8b42d-0e00-3fd3-ffb7-d0baa538ef1d.png)

するとqitalinebot(リソース名)というDBが1件存在するのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/245621cc-cdd4-386f-bddf-e909498f6d11.png)

今回はDBを新規で作成していきましょう。
右上の"Create Database"をクリックし、DBの名称を入力して作成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/5559c304-525e-3167-5d01-88b74641bb4e.png)

作成すると以下のような画面になります。
DBの中身はJSONと呼ばれる形式で記述します。
ここではJSONの詳細については触れませんので、別途調べて頂けたらと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/10d74073-7351-a91e-291d-a857ec243488.png)

今回は以下のように"status"を追加します。
新規で追加する場合は既存の"_id":"○○○○"に","を付けることを忘れないようにしてください。
"status"や"001"の部分もわかれば何を入れてもらっても構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/996f8085-536a-842c-fd63-aef9e9ca97b9.png)

追記が終われば左上の"Create Document"(2回目以降は"Save Changes")で保存します。
※Ctrl+Sでもいけます
すると以下のようにファイルが追加されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/00d9359e-a0c3-43a5-44c2-ac9718c23f36.png)

これでCloudantDBの準備は完了です。

#7-2. Node-REDの設定最終形
最終的には以下のようにNode-REDを設定します。
実行ノードを起動した時点、DBを読み込んだ後、DBに書き込む前でmsg.payloadがどうなっているか確認するためdebugノードを3カ所に設置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/2d1e10d5-7280-86dd-5c22-ffd3949997ed.png)

#7-3. CloudantDBからのデータ取得について
まず最初にデータを取得するところまでをみていきます。
###1. injectノード
使い方の詳細は[第3回の記事](https://qiita.com/VulpeS404/items/c2e0db947db1b4c6229c)か[ノード解説まとめ](https://qiita.com/VulpeS404/items/0ce3057451d18f4d87ec)を見てください。

今回は以下のように設定します。
内容は何でも問題ないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/f07ce9f7-60a2-7dca-7cd1-e43ffdb7ac3d.png)

###2. cloudant inノード
パレットのストレージに格納されているノードです。
CloudantDBからデータを取得するのに使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/189a8fbc-4447-48c1-228e-683b05e0a768.png)

実際に配置すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/cbd2d48b-27d1-150a-5736-bd947c80acc4.png)

ノードをダブルクリックして中をみてみましょう。
"Service"は接続されているCloudantDBが自動で割当てられます。
"Database"はアクセスしたいCloudantDBのDB名を記載します。
"Search by"はDBにある_idを基に取得するかやDBのデータ全て取得するか等が選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/3a2bb80c-8136-dcb4-de00-fbeb6984f7f2.png)

今回は以下のように設定します。
"Database"は先程新規作成したDB名です。
"Search by"は"all documents"にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/d8298aec-5094-614d-9fcf-f30da4f2f2a3.png)

###3. debugノード
使い方の詳細は[第4回の記事](https://qiita.com/VulpeS404/items/554119209a4469130b98)か[ノード解説まとめ](https://qiita.com/VulpeS404/items/0ce3057451d18f4d87ec)を見てください。
今回は全てmsg.payloadの中身を見たいので以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/909647c1-abd7-fc5c-50d0-bce230692ddc.png)

上記全ての設定が完了したら、以下のように接続しデプロイします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/e9963bf4-a855-41c0-f53b-441b19d44f7b.png)

その後injectノードを実行してみて下さい。
debugの結果を見てみましょう。
最初の実行用ノードを実行した後の段階ではmsg.payloadには"テスト"が格納されています。
その後DBからデータを取得した後のmsg.payloadを見ると、"テスト"は上書きされDBの内容が入っているのがわかります。
statusには"msg.payload.0.status"でアクセスできることがわかります。
※過去[第5回の記事](https://qiita.com/VulpeS404/items/554119209a4469130b98)でarrayに入ってるので".0."ではなく [0]としていました。これはmsg.payload自体がObjectになっていて、Objectの中身の一つがarrayだったためです。
今回はmsg.payload自体がarrayのため、0への接続は".0."になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/34300ec6-7200-1245-fe66-01451a7262fc.png)

これでDBの読込方法はわかりました。
では次にDBへの書込方法を見ていきましょう。

#7-4. CloudantDBへのデータの書き込みについて
###4. changeノード
使い方の詳細は[第6回の記事](https://qiita.com/VulpeS404/items/308f599660a79d2c457e)か[ノード解説まとめ](https://qiita.com/VulpeS404/items/0ce3057451d18f4d87ec)を見てください。

今回は以下のように設定します。
CloudantDBの連携においてどんな形でデータを受信し、どんな形で最終的にデータを送信するかを理解することは必須です。
7-3で説明した通り、"msg.payload.0.status"で"status"の値にアクセスできます。
それを"000"から"001"に変えるために"msg.payload.0.status"="001"としているのが1行目です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/dd04181b-9af8-3b8d-06c7-3ac888527b0a.png)

それでは2行目はなんのために存在するかというと、以下のようにDBを読み込んだ時のデータ構造のままデータを更新し、DBにデータを書き込むことはできないからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/10f44661-061c-30ea-8008-c55dcd961aaf.png)

最終的にDBにデータを送信する時には、msg.payloadがarrayではなくobjectの構造を取っている必要があるのです。
これは後続のノードでDBに格納するのをmsg.payloadのオブジェクトのみにしているためです。
後続でオブジェクトのみにしなければいいのでは？と言われるとその通りなのですが、その場合の処理結果は余計な内容も含まれ新規レコードとして追加されてしまうことになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/cf968178-cf81-3545-4264-047597e4639a.png)

そのため、array状態の"msg.payload"からobjectにあたるmsg.payload.0"のみを抽出し、"msg.payload"に上書くという手順が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/6a2d6b51-5ecb-b3f8-e8a0-6f84d40f208c.png)

###5. cloudant outノード
パレットのストレージに格納されているノードです。
CloudantDBにデータを格納するのに使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/8fe08ddd-f3b5-c3e2-5413-61178f8dfe78.png)

実際に配置すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/bbcae689-82cc-796d-acfd-9d6bbd67caf8.png)

ノードをダブルクリックして中をみてみましょう。
"Service"は接続されているCloudantDBが自動で割当てられます。
"Database"はアクセスしたいCloudantDBのDB名を記載します。
"Operation"はDBに格納したり、逆にDBから削除する等を選択できます。
"Only store msg.payload object"はチェックをいれるをmsg.payloadに格納されているobjectのみを対象とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/d43238e8-dd1b-6243-caae-d55b71f1a87e.png)

"Only store msg.payload object"にチェックをいれないとmsg.payloadにある様々な情報も追加され、別のレコードとして登録されてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/9961942c-427d-8567-e27a-6de7d595c6a4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/885befc3-219c-80ba-8fc0-1d40b44013bb.png)

今回は以下のように設定します。
"Database"は先程新規作成したDB名です。
"Operation"はDBのデータを編集したいので"insert"にします。
"Only store msg.payload object"には同じレコードに該当オブジェクトのみ書き込みたいのでチェックをいれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/e729ea4f-070d-6544-0929-33b394819252.png)

以上で各ノードの設定は終わりです。

それでは各ノードを以下のように繋ぎデプロイしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/bbbb858e-b1cf-96f8-a507-a19bae1a271b.png)

実行前にCloudantDBの中身を開き、statusに000が入ってることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/c5726686-d317-fbf0-1e28-3049e8c57529.png)

確認できたらinjectノードを実行しましょう。

すると、デバッグとしては7-3で解説した通り、テストが上書きされarray状態でDBの内容が入ってきます。
次にstatusを001に書き換え、objectのみを抽出しているのでDB書き込み前段階の"msg.payload"はobjectになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/d9dd0ce9-78e1-1549-9a2b-b47b5761493a.png)

それではもう一度CloudantDBの中身を開き、statusを確認してみましょう。
するとstatusには001が入っていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395385/45572a0c-0c1a-ff37-9bbc-1f3b56fa61d7.png)

これでDBからデータを取得し、該当箇所を書き換えDBに格納することができるようになりました。

#おわりに
今回でCloudantDBとNode-REDを連携することができるようになりました。
次回はこのステータス管理を活用し数度のやりとりを行うbotを作成していきます。