【ハンズオン資料】StrongLoopのLoopBackを使ってBluemix上のdatabaseをAPIで操作（CRUD）

本記事は、StrongLoopの「LoopBack」を使って、databaseをAPI化させる手順を紹介しています。

※ 本記事では、「ClearDB MySQL Database」を使いますので、Bluemixの米国リージョンで作業を行ってください。

# 今回やること
初めにローカルにLoopBackをインストールし、どんな動きをするのか、何ができるのかを試してみます。
そのあと、Bluemix上に「ClearDB MySQL Database」を作成して「StrongLoop MySQL Connector」を使ってローカルで生成した、data sourceやmodelをMySQLと連動して、そのデーターをAPIで操作してみたいと思います。

・StrongLoop API Document：https://apidocs.strongloop.com/

# Bluemix新規登録
・新規登録から30日間無料で使えます。
・この期間間、Bluemixと連携されている100以上のAPIやIBMのサービスがほとんど無料で使えます。
　[Bluemix新規アカウント取得はこちら](https://developer.ibm.com/sso/bmregistration?lang=ja_JP&ca=dwjapan-_-bluemix-_-bluemix-registration-_-landing)

# 前提条件
・Node.jsとnpmのインストール
　参考サイト：https://docs.npmjs.com/getting-started/installing-node

・CF CLI（Cloud Foundry Command Line Interface）のインストール
　インストールは、Bluemixのダッシュボードで確認できます。
　

# 作業手順
・StrongLoopインストール
・ローカル環境にLoopBackアプリケーション生成（基盤）
・StrongLoop MySQL connectorインストール
・Bluemixにランタイム（Node.js）とMySQL作成
・LoopBackモデル生成
・ローカルのLoopBackアプリをBluemixにデプロイ

# StrongLoopインストール

```lang:ターミナル：インストール
npm install -g strongloop
```

```lang:ターミナル：インストール確認
slc -v
```

※ 下記の通り、出力されると正常
![スクリーンショット 2015-12-14 23.21.41.png](https://qiita-image-store.s3.amazonaws.com/0/29452/321fd4f9-bcaf-bec5-1886-94f93ebddc8a.png)

# ローカル環境にLoopBackアプリケーション生成（基盤）
※ 私のアプリケーション（ディレクトリ）名は「joohoun-loopback」です。

```lang:ターミナル：ディレクトリ生成
mkdir <directory>
```

```lang:ターミナル：開発を行うディレクトリへ移動
cd <directory>
```

```lang:ターミナル：LoopBackアプリケーション生成
slc loopback <アプリケーション名（ディレクトリ名を入れる）>
```

① 下記の画面が出力される
② そのままEnter（アプリケーション名を変更する場合は、変更後「Enter」）
![スクリーンショット 2015-12-14 23.31.48.png](https://qiita-image-store.s3.amazonaws.com/0/29452/7f8da530-65d8-5e80-2d17-4dfd1cbb432d.png)

・インストール完了確認

```lang:ターミナル：アプリケーションディレクトリへ移動
cd <directory>
```

```lang:ターミナル：起動
node .
```

下記のようにサーバーが起動される。
![スクリーンショット 2015-12-14 23.34.10.png](https://qiita-image-store.s3.amazonaws.com/0/29452/32d75522-daf9-0136-7e43-3b67ab715e4f.png)

ここで、[http://0.0.0.0:3000/explorer](http://0.0.0.0:3000/explorer)をブラウザにて実行してみましょう。
表示された画面の「User」をクリックすると、下記のようにAPIが表示されます。
APIのエンドポイントは、URL(http://0.0.0.0:3000）+ BASE URL（/api）+ Model（Users）
![スクリーンショット 2015-12-14 23.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/29452/144020f8-4736-282a-61ec-b05853c82a07.png)

# StrongLoop MySQL Connectorインストール
StrongLoop Connectは、データーベースだけではなく、REST APIやEmailなどとも連動できます。
今回は、Database connector（MySQL）を使って、BluemixのMySQLサーバーと連動させます。Database Connectorは、MySQLだけではなくMongo DBやOracleなどのConnectorも提供されています。
詳細は、こちらのリンクをご覧ください。
https://docs.strongloop.com/display/public/LB/Connecting+models+to+data+sources

```lang:ターミナル：アプリケーションディレクトリへ移動
cd <directory>
```

```lang:ターミナル：loopback-mysql-connectorインストール
npm install --save loopback-connector-mysql
```

## data source 生成

```lang:ターミナル
slc loopback:datasource AccountDb
```

data source名はデフォルトのまま「Enter」をして、Connectorタイプで「MySQL」を選択。

![スクリーンショット 2015-12-15 10.30.07.png](https://qiita-image-store.s3.amazonaws.com/0/29452/bebfeccd-61e4-fa09-49ce-dcd1bcc38d68.png)

# BluemixにNode.jsとMySQL作成
下記の手順に従って、Bluemix上に「Node.js」と「MySQL」を作成します。

## Node.js生成
① ダッシュボードに移動
② Cloud Foundry アプリ選択
③ WEB選択
④ SDK Node.js 選択と実行
⑤ アプリ名入力（先ほど作成したStrongLoopアプリと同じ名）
⑥ 完了
⑦ Node.jsアプリが生成されていることが確認できます。
![スクリーンショット 2015-12-15 10.47.03.png](https://qiita-image-store.s3.amazonaws.com/0/29452/69cb3947-bb8f-6d78-810d-c121db4bea9e.png)

## ClearDB MySQL Database作成
① サービスまたは APIの追加
② 検索バーにて「mysql」検索
③ 表示された「ClearDB MySQL Database」選択
④ 作成される内容（スペースなど）を確認
⑤ 「作成」クリック
⑥ 先ほど、作成した「Node.jsアプリ」に「ClearDB MySQL Database」が追加されたのを確認。
![スクリーンショット 2015-12-15 10.58.19.png](https://qiita-image-store.s3.amazonaws.com/0/29452/1550dc44-50e9-2f3a-127e-2cd0e1cdce10.png)

・作成されたDBの環境変数を確認
![スクリーンショット 2015-12-16 11.08.22.png](https://qiita-image-store.s3.amazonaws.com/0/29452/0a06c80b-aa85-3636-6ebb-fb1c3a638297.png)


・環境変数から取得したBluemixのDatabase情報設定
設定ファイル：server/datasources.json
ローカルに作成した、LoopBackアプリの「datasources.json」を開くと下記のようになっている。
![スクリーンショット 2015-12-15 12.49.40.png](https://qiita-image-store.s3.amazonaws.com/0/29452/0cf181d3-bf4f-64c9-f32f-f87d46566bb7.png)

・設定内容
下記のコードの「 < ... >」部分をBluemixのMySQL情報を設定。

```lang:json
{
  "db": {
    "name": "db",
    "connector": "memory"
  },
  "AccountDb": {
    "host": "<database_subdomain>.cleardb.net",
    "port": 3306,
    "database": "<database>",
    "password": "<password>",
    "name": "AccountDb",
    "user": "<username>",
    "connector": "mysql"
  }
}
```

```lang:ターミナル：Model生成
slc loopback:model Account
```

下記の内容で、Modelを作成します。（Nameなどはみなさん自由に作れます。）

![スクリーンショット 2015-12-15 13.00.05.png](https://qiita-image-store.s3.amazonaws.com/0/29452/3d127e76-a532-1337-37b3-007dff8fa0e9.png)
※ 下記のリンクからStrongLoopで提供されている"auto-migrate"ツールも使えます。
[LoopBack-Auto-migrate](https://docs.strongloop.com/display/public/LB/Creating+a+database+schema+from+models?cm_mc_uid=16874591945214464544380&cm_mc_sid_50200000=1450140472)

・DBのスキーマを追加

```lang:ターミナル：serverフォルダーの中に「bin」フォルダーを生成
cd server
mkdir bin
```

下記のように、serverフォルダーに「bin」フォルダーが生成されていることを確認
![スクリーンショット 2015-12-15 13.13.15.png](https://qiita-image-store.s3.amazonaws.com/0/29452/fb26a811-3600-3b13-25d2-fcb6efa05a8e.png)

・automigrate.js生成
上記で生成した「bin」フォルダーに下記の内容で「automigrate.js」ファイルを作成。

```lang:ターミナル：server/bin/automigrate.js
var app = require('../server');

var accounts = [
  {
    email: 'foo@bar.com',
    createdAt: new Date(),
    lastModifiedAt: new Date()
  },
  {
    email: 'baz@qux.com',
    createdAt: new Date(),
    lastModifiedAt: new Date()
  }
];

// ~/server/datasources.jsonの「accountDb configuration」
var dataSource = app.dataSources.AccountDb;

// Account modelのautomigrates
dataSource.automigrate('Account', function(err) {
  if (err) throw err;

  // ~/common/models/Account.jsonのAccount model
  var Account = app.models.Account;
  var count = accounts.length;
  accounts.forEach(function(account) {

     // Account tableにデーター挿入
     Account.create(account, function(err, record) {
      if (err) return console.log(err);

      console.log('Record created:', record);

      count--;

      if (count === 0) {
        console.log('done');
        dataSource.disconnect();
      }
    });
  });
});
```

ここまで出来たら、実行！

```lang:ターミナル
node server/bin/automigrate.js
```

下記のようにレコードが追加される。
![スクリーンショット 2015-12-15 13.25.05.png](https://qiita-image-store.s3.amazonaws.com/0/29452/c351532c-acb5-f4f7-9ad1-0bddf48ee2e8.png)

・ここまで出来たら、データーの確認をしてみましょう。

まず、BluemixのMySQLにレコードが挿入されているかを確認。
※ 私は、mysqlコマンドにてBluemixのMySQLに接続します。

```lang:ターミナル
mysql -h <database_host> -u <username> -p
```

![スクリーンショット 2015-12-15 13.29.56.png](https://qiita-image-store.s3.amazonaws.com/0/29452/6956dbd8-4c33-3af9-67d1-845ef8dc9522.png)

・次は、LoopBackの内容を確認。

```lang:ターミナル
slc run
```

※ 実行の際にエラーで実行できない場合は、下記のコマンドでプロセス終了後再実行

・エラー内容
"Error: listen EADDRINUSE 0.0.0.0:3000"

```lang:ターミナル
ps -ax | grep node

[Result]
 1301 ttys000    0:01.90 node .
 4116 ttys002    0:00.01 grep node

kill -9 1301 -> PID 1301を終了
```

・起動されたらLoopBack Explorerに接続
http://0.0.0.0:3000/explorer

・Accountが生成されていることが確認できる。
　この時点で、APIのエンドポイントが生成されている状態になります。
![スクリーンショット 2015-12-15 13.54.44.png](https://qiita-image-store.s3.amazonaws.com/0/29452/0c00ef08-5a93-554d-2d8e-d147ef70cbe0.png)

・DBの中身を見てみましょう。
① GETを選択
② 「Try it Out」選択
![スクリーンショット 2015-12-15 14.06.40.png](https://qiita-image-store.s3.amazonaws.com/0/29452/cbfdc6b6-69c1-5ea2-9d24-a2d8bffeab3a.png)

MySQLコマンドでセレクトした、BluemixのDB内容と同じであることと、作成されたModelのAPIを実行して結果が表示されていることが確認できる
![スクリーンショット 2015-12-15 14.06.51.png](https://qiita-image-store.s3.amazonaws.com/0/29452/1a861235-cee4-f8d8-d1a6-6a7663a1390e.png)

・次は、POSTでレコードを追加してみる。
① POSTを選択
② 挿入するデーターを設定
③ 「Try in Out」クリック
![スクリーンショット 2015-12-15 14.13.16.png](https://qiita-image-store.s3.amazonaws.com/0/29452/4d78be68-4f4f-f169-8f7e-e70f240002af.png)

・挿入されたデーターを確認。

もう一回、GETする
![スクリーンショット 2015-12-15 14.17.22.png](https://qiita-image-store.s3.amazonaws.com/0/29452/bcb630a0-5daf-87a1-25a4-39ef1a1fcc49.png)

BluemixのMySQLの状態を見る。
![スクリーンショット 2015-12-15 14.19.09.png](https://qiita-image-store.s3.amazonaws.com/0/29452/f06a89c4-2720-898e-fd2d-cdab04dd58af.png)

・生成されたAPIでデーターを挿入してみる。
POSTの「Curl」をそのまま、ターミナルにて実行するとデーターの挿入ができる。
確認は、上記の「GET」や「MySQL：Select」で。
![スクリーンショット 2015-12-15 14.24.08.png](https://qiita-image-store.s3.amazonaws.com/0/29452/35325fcb-c71d-7aed-2d03-59bea1289e69.png)

ここまで出来たら、データーの削除や修正など試してみてください。

# APIをBluemixに公開しましょう。

① Bluemixのダッシュボードに移動
② コーディングを開始
③ スターター・コードをダウンロード
![スクリーンショット 2015-12-15 14.45.16.png](https://qiita-image-store.s3.amazonaws.com/0/29452/c6d2f522-94c9-8c3a-0058-d4d8750e23d6.png)

## ファイル構成
① 下記の2つのファイルを「Bluemixアプリ」から「StrongLoopアプリ」にコピーします。
１。manifest.yml
２。.cfignore ← 非表示フィルなので、ご注意ください。表示されない方はコマンド(cp)
で。
② StrongLoopアプリフォルダーの「node_modulesフォルダー」を削除

![スクリーンショット 2015-12-15 15.43.49.png](https://qiita-image-store.s3.amazonaws.com/0/29452/70caafcc-5964-00fd-ea7a-15433f1418b3.png)

## StrongLoopアプリのファイルを編集します。

```lang:package.json
"scripts": {
  "start": "node server/server.js",
  "pretest": "jshint ."
 },
"dependencies": {    
  ..
  "loopback-connector-mysql": "^1.0.3"
  "cfenv": "1.0.x"
  ..
```

修正後はこんな感じ。
![スクリーンショット 2015-12-15 18.48.23.png](https://qiita-image-store.s3.amazonaws.com/0/29452/dfa2752b-ca36-a758-33a8-2992f94f6b1c.png)


```lang:server/server.js
var loopback = require('loopback');
var boot = require('loopback-boot');
// cfenvで、「Cloud Foundry」環境に接続します。
// cfenvの詳細はこちら：https://www.npmjs.com/package/cfenv
var cfenv = require('cfenv');

var appEnv = cfenv.getAppEnv();
 
var app = module.exports = loopback();
app.start = function() {
  // web server スタート
  return app.listen(appEnv.port, appEnv.bind, function() {
    app.emit('started');
    console.log('Web server listening at: %s', app.get('url'));
  });
};

boot(app, __dirname, function(err) {
   if (err) throw err;
   if (require.main === module)
     app.start();
});
```

オッケー！ここまで出来たら、Bluemixにデプロイしましょう！

```lang:Bluemixにデプロイ
cf api https://api.ng.bluemix.net
cf login -u <user_name> -o <organization> -s <space>
cf push joohoun-loopback
```

#公開完了後の確認。

① ダッシュボード
② アプリのURLを確認
③ BluemixアプリURL + /explorer をブラウザで実行
④ 先ほど、ローカルで作業した画面が表示されることが確認できる。

![スクリーンショット 2015-12-15 18.57.45.png](https://qiita-image-store.s3.amazonaws.com/0/29452/08de6fd1-a11d-2b46-7fef-fbbb2279b8a0.png)

# まとめ
まず、ここまで作業が終わったら今回生成されたAPIを使ってDBのデーターを操作できるようになります。
先ほどローカルで生成されたAPIは、ウェブに公開されていなかったため外部からは接続できなかったが、Bluemix上にアプリを公開することで、外部のどこからでも接続（通信）ができる「API」ができました。

今回の資料では、StrongLoopの「LoopBack」を使いましたが、「StrongLoop Arc」はGUIを提供していて全操作（datasource、model、DB Connectionなど）をブラウザで行うことができます。
なお、Bluemixのカテゴリから「StrongLoop LoopBack Starter」ですと、手軽にStrongLoopを使うことができます。

このように、DBをAPIで操作できるようになるといろんな場面で必要にしていたサービスや様々なアイデアが形に変わるのではないかと思います。

是非、今後もBluemixとStrongLoopをお楽しみに！

# Bluemixコミュニティ
※ Bluemixに関する技術関連情報や最新情報、イベント告知、Bluemixユーザーコミュニティの皆さんからの最新記事などを配信しています。
下記のリンクから「Bluemix」の「今」をフォローできます！

・Facebook ： [Bluemixユーザーグループ](https://facebook.com/groups/bmxug)
・Qiita ： [Bluemix Qiitaページ](http://qiita.com/tags/Bluemix)
・Slack ： [Bluemix User Group(BMXUG)の交流用](http://bit.ly/1QzOgiC)
・stackoverflow ： [stackoverflow（コミュニティQ&A）](http://ja.stackoverflow.com/questions/tagged/bluemix)
・Twitter ： @ibm_ecod_japan