Node-REDでニフティクラウドmbaasにデーター保存ノードを作ってみた！

# Introduction

[Node-RED](http://nodered.org/)で[ニフティmBaaS](http://mb.cloud.nifty.com/)を使って、サーバーにデーター登録する実装のまとめ

# Node-REDとは

Node-RED is a tool for wiring together hardware devices, APIs and online services in new and interesting ways.
[From home page](http://nodered.org/)

# Practice

First flow: http://nodered.org/docs/getting-started/first-flow.html
Second flow: http://nodered.org/docs/getting-started/second-flow.html

# 新しいノードを作る

こちらの[Document](http://nodered.org/docs/creating-nodes/first-node.html)のベースに作成しました。

* STEP 1: nodeには二つのファイルが必要
    * HTMLファイル：ncmb-node.html
 
```html

<script type="text/javascript">
    RED.nodes.registerType('ncmb',{
        category: 'function',
        color: '#a6bbcf',
        defaults: {
            name: {value:""},
            appkey: {value:""},
            clientkey: {value:""}
        },
        inputs:3,
        outputs:1,
        icon: "file.png",
        label: function() {
            return this.name||"ncmb";
        }
    });
</script>

<script type="text/x-red" data-template-name="ncmb">
    <div class="form-row">
        <label for="node-input-name"><i class="icon-tag"></i> Name</label>
        <input type="text" id="node-input-name" placeholder="Name">
   </div>
   <div class="form-row">
        <label for="node-input-appkey"><i class="icon-tag"></i> App Key</label>
        <input type="text" id="node-input-appkey" placeholder="AppKey">
   </div>
   <div class="form-row">
        <label for="node-input-clientkey"><i class="icon-tag"></i> Client Key</label>
        <input type="text" id="node-input-clientkey" placeholder="ClientKey">
    </div>
</script>

<script type="text/x-red" data-help-name="ncmb">
    <p>A simple node that test with NCMB data register</p>
</script>
```

    * Javascriptファイル: ncmb-node.js

```js
var NCMB = require("ncmb");

// Require main module
var RED = require(process.env.NODE_RED_HOME+"/red/red");

function NcmbNode(config) {
    RED.nodes.createNode(this,config);
    this.appkey = config.appkey;
    this.clientkey = config.clientkey;
    var node = this;
    this.on('input', function(msg) {
        this.log("[FROM NODE] start action");
        this.log(this.name);
        this.log(this.appkey);
        this.log(this.clientkey);

        var ncmb = new NCMB(this.appkey,this.clientkey);
        var IoTData = ncmb.DataStore("IoTData");
        var obj = new IoTData();
        obj.set("message", msg.payload)
           .save()
           .then(function(gameScore){
              // 保存後の処理
              msg.payload = "Save Success";
              node.send(msg);
           })
           .catch(function(err){
              // エラー処理
              msg.payload = "Save Fail";
              node.send(msg);
           });
    });
}

RED.nodes.registerType("ncmb", NcmbNode);
```

* nodeを保存する場所を設定
    * 設定ファイル：「ユーザーフォルダー」/.node-red/settings.js
    * 設定箇所

```
    // Node-RED scans the `nodes` directory in the install directory to find nodes.
    // The following property can be used to specify an additional directory to scan.
    //nodesDir: '/home/nol/.node-red/nodes', ★ここで更新
```

* 確認

コンソールで、以下のようにコマンド実施

```
node-red
```
![nodered_action1.png](https://qiita-image-store.s3.amazonaws.com/0/18698/97eb6093-9310-d813-554e-2ee045d526d9.png)

ブラウザーで表示するURLを開きます
![nodered_action2.png](https://qiita-image-store.s3.amazonaws.com/0/18698/2a5a4bb1-6558-43e1-9d29-e45c14868629.png)

injectノードを追加し、ダブルクリックします。
TopicにmessageDataを入れます。
![nodered_action3.png](https://qiita-image-store.s3.amazonaws.com/0/18698/4c92395f-9c85-3b49-34ac-22b739fd98ff.png)

ncmbノードを追加し、ダブルクリックします。
appkey, clientkey を入れます。こちらの情報は[ニフティクラウドmbaas](http://mb.cloud.nifty.com/)にてアプリ作成する時に自動的に発行されたキーです。

debugノードを追加します。３ノードを以下のようにリンク付けます。
![nodered_action5.png](https://qiita-image-store.s3.amazonaws.com/0/18698/34b18f7d-defd-b5ee-f1c9-0773d77b24a9.png)
終わったら、Deployをし、messageDataノードの隣にあるボタンをクリックし、mbaasのデーターストアにてサーバーにてデーターが保存され、debugにてメッセージ確認します。
![nodered_action6.png](https://qiita-image-store.s3.amazonaws.com/0/18698/c67b556b-10ea-338a-8d2b-ce19ac80376d.png)

これで今後はセンサーデーターと連携できたらなと・・


# Trouble shooting

(1) "Waiting for missing types to be registered:" Error

```
1 Dec 15:50:48 - [info] Waiting for missing types to be registered:
1 Dec 15:50:48 - [info]  - lower-case
```
![nodered_error1.png](https://qiita-image-store.s3.amazonaws.com/0/18698/d5e22c94-6975-5593-4e06-a6c4a76b0d46.png)

Javascriptファイルでは何かエラーがあったりとかすると上記の確認をすると、
このようにエラーがでましたね。
しかもnodeが上手くインポートされていないよと表示ありました。
![nodered_error2.png](https://qiita-image-store.s3.amazonaws.com/0/18698/7a6a6e51-4b20-c38a-aa64-551f589d5948.png)

; や　）のようなタイピングミスだったので、すぐ修正できましたが、
何かデバッグ的なログが欲しかったです。