LoopBackをサクッと触ってみた（環境構築からAPIまで）＋おまけでUnity

# [LoopBack](http://loopback.io/)って？
Node.jsで動作するオープンソースなBaaS
機能的にはユーザ管理、データ保存、PUSH通知などモバイルアプリ開発に必要な機能が結構揃っている
特徴としては自由なこと。APIの構築からやるのでカスタマイズできるし、必要であればサーバ側の処理も書ける
さらにデータの保存場所もアドオンで選べる（メモリ上、SQLite、MongoDBなど）
あとはIBMに買収されたこともあり、オープンソースBaaSとしては知名度が高く記事が多いので助かる

前回、記事を書いたのでそちらもどうぞ
[Parseがサービス終了する今、選ぶべきはオープンソースBaaS！探し求めていたのはLoopBackだった…！](http://qiita.com/Mr_Y/items/efc6e946efc057d08f9e)

# 利用する環境
MacOS X Yosemite(今回はMac上に構築)
Node.js 4.4.3
loopback 6.0.0
MongoDB v3.2.1

# 今回の流れ
環境構築の道のりが長いのでここでまとめ
1.Node.jsのセットアップ
2.loopbackのセットアップ
3.MongoDBのセットアップ
4.slcコマンドでアプリを作成
5.LoopBackアプリにMongoDB connectorをインストール
6.Strong Arcを起動
7.アプリのMongoDB設定
8.Modelの作成
9.API叩く
10.MongoDB内の確認

# Node.jsのセットアップ
[Node.jsをダウンロード](https://nodejs.org/en/)（LTSを選んだ）

Node.jsのインストール確認（v4.4.3とでた）

```shell-session
node -v
```

# loopbackのセットアップ

```shell-session
sudo npm install -g loopback
sudo npm install -g strongloop
```

StrongLoopコマンドを確認（strongloop v6.0.0 (node v4.2.4)などが表示された）

```shell-session
slc -v
```

# MongoDBのセットアップ
参考：<a href="#why_mongo">なんでMongoDBにしたの？</a>

[Home brew](http://brew.sh/index_ja.html)を使ってMongoDBをインストール（時間がかかるので休憩）

```shell-session
brew install mongodb
```

インストールできたかバージョン確認（MongoDB shell version: 3.2.1とでた）

```shell-session
mongo --version
```

mongo起動

```shell-session
mongod --config /usr/local/etc/mongod.conf 
```

# slcコマンドでLoopBackアプリを作成

作業を行うディレクトリを作成し、移動して

```shell-session
slc loopback
```

おっさんがアプリ名を聞いてくるので、今回は「sample」という名前でアプリを作る

```shell-session
     _-----_
    |       |    .--------------------------.
    |--(o)--|    |  Let's create a LoopBack |
   `---------´   |       application!       |
    ( _´U`_ )    '--------------------------'
    /___A___\    
     |  ~  |     
   __'.___.'__   
 ´   `  |° ´ Y ` 

? What's the name of your application? sample
```

自動で必要なファイルを作成してくれる

# LoopBackアプリにMongoDB connectorをインストール

LoopBackとMongoDBをつなぐコネクタ（※アプリ単位で設定する）

```shell-session
npm install loopback-connector-mongodb --save
```

# Strong Arcを起動
参考：<a href="#what_strong_arc">Strong Arcって何？有料？</a>

loopbackアプリのディレクトリに移動して

```shell-session
slc arc
```

ブラウザが起動してユーザ登録を促される
![registration.png](https://qiita-image-store.s3.amazonaws.com/0/109724/a86e6c49-a466-8054-46cd-32a4781c6298.png)

登録後、Composerを選択
![composer.png](https://qiita-image-store.s3.amazonaws.com/0/109724/0055128f-6edd-ca90-0af2-c5c9924b3298.png)


# アプリのMongoDB設定
Composerの左下部からMongoDBを選択
![mongodb_menu.png](https://qiita-image-store.s3.amazonaws.com/0/109724/2d51b511-ff0c-6ef4-c09e-78423ecaee3d.png)

以下のように設定

![mongosettings.png](https://qiita-image-store.s3.amazonaws.com/0/109724/502dd081-d8cc-b322-4b93-135e4cc0566c.png)

設定例
**Name**:sampledb
**username**:user
**Host**:localhost
**Port**:27017
**Database**:sampledb
**Connector**:MongoDB

Save Datasource->TestConnectionをクリック

SuccessとでたらOK

# Modelの作成
左側のAdd New Modelをクリックして以下のように設定

![modelapi.png](https://qiita-image-store.s3.amazonaws.com/0/109724/e385dccb-dce7-d893-d323-72698b26f307.png)


設定例
**Name**:book
**Plural**:book
**Base model**:PersistedModel
**Data source**:sampledb
**Propertiesの1番目**
　Name:name
　Type:string
　Required:チェック
**Propertiesの2番目**
　Name:price
　Type:number
　Required:チェック

## アクセスできるか確認
空のJSONが返ってくる
http://localhost:3000/api/books

# APIを叩く
右上の再生ボタンからアプリを起動
![play.png](https://qiita-image-store.s3.amazonaws.com/0/109724/3143d9bc-e328-ea90-e5b2-cd9449ce9b53.png)

## データ登録
curlコマンドでPOSTデータを送って更新

```shell-session
curl -H "Content-Type: application/json" -d '{"name":"BOOKNAME","price":100}' http://localhost:3000/api/books
```

## 登録データ確認
改めて下記にアクセスするとJSONが返ってくる
http://localhost:3000/api/books

```json
[
 {
   "name":"BOOKNAME",
   "price":100,
   "id":"56b1d70aff16fe6887baae52"
 }
]
```

## Unityで接続するサンプルコード
UnityWebRequestで書いた

### データの登録

```csharp
public IEnumerator PostBook ()
{
	string url = "http://localhost:3000/api/books";
	using (UnityWebRequest request = UnityWebRequest.Post (url, " ")) {
		// ヘッダ
		request.SetRequestHeader ("Content-Type", "application/json");

		IDictionary requestBody = new Dictionary<string, object> ();
		requestBody.Add ("name", "我輩は猫である");
		requestBody.Add ("price", 280);
		string bodyData = Json.Serialize (requestBody);
		UploadHandler uploadHandler = new UploadHandlerRaw (System.Text.Encoding.UTF8.GetBytes (bodyData));
		request.uploadHandler = uploadHandler;

		// 通信開始
		yield return request.Send ();

		// 通信結果
		string json = request.downloadHandler.text;
		if (request.responseCode == 200) {
			Debug.Log ("Success >>" + json);
		} else {
			Debug.Log ("Error >>" + json);
		}
	}
}
```

### データの取得

```csharp
public IEnumerator GetBook ()
{
	string url = "http://localhost:3000/api/books";
	using (UnityWebRequest request = UnityWebRequest.Get (url)) {

		// 通信開始
		yield return request.Send ();

		// 通信結果
		string json = request.downloadHandler.text;
		if (request.responseCode == 200) {
			Debug.Log ("Success >>" + json);
		} else {
			Debug.Log ("Error >>" + json);
		}
	}
}
```

# MongoDB内の確認
最後にデータが入っているか確認

```shell-session
$ mongo
> show dbs         //DB名の確認(sampledb)
> use sampledb     //DBの使用
> show collections // コレクションの表示(book)
> db.book.find()   // bookコレクションの全ドキュメント表示
```

# 補足
## <a name="why_mongo"/>なんでMongoDBにしたの？
国内でBaasを提供しているKii Cloud、Nifty Cloud、アピアリーズや、サービス終了を発表したParseもMongoDBを使っているため
※個人的な動機としては移行だったので合わせておきたかった
※[meanスタック](http://qiita.com/KENJU/items/41f54d157dae69924386)という言葉もあるので、標準的な組み合わせぽい
参考：[BaaS勉強会、パネルディスカッションから分かったBaaS各社の狙いと違い](http://blog.mb.cloud.nifty.com/?p=368)

## <a name="what_strong_arc"/>Strong Arcって何？有料？
LoopBackのモデル作成、デプロイ等を行うためのGUIツール
今回触ったComposerは無料。ただしユーザ登録が必要
それ以外の機能は30日間のトライアル
[StrongLoop subscription products are free to try for 30 days!](https://strongloop.com/node-js/subscription-plans/)
便利だったのでStrong Arcを使ってみた（CLIでも同様の作業が可能）


## アプリの終了方法は？
loopbackのアプリの終了はStrong Arcの右上からSTOPを選ぶ

Strong Arcの終了はslc arcのプロセスIDを取得して、killする

```shell-session
ps aux | grep node
```

```shell-session
kill -kill 123456(プロセスID)
```

## 作成されるAPI
http://localhost:3000/explorer/
にアクセスするとbooksが提供しているAPIが一覧で見える

# おわりに
サクッとではなかったことを謝る。すまない
MongoDBの知識もまだまだ浅いので、何か足りない内容があれば更新して修正するつもり

次回、デプロイについての記事はこちら
[さくらVPS(Cent OS6.7)上にLoopBackアプリをデプロイする](http://qiita.com/Mr_Y/items/91e9d71d771c75d532bc)