Loopbackで簡単なRESTサービスを作ってみる

Loopback 2.17.1を使って、さくっとRESTfulなWebサービスを作ってみました。

# loopbackの導入
コマンド一発。

```shell-session

% npm install loopback
```

[loopbackを配布元サイト](http://loopback.io/)では下記のように指定しています。

```shell-session

% npm install -g strongloop
```

試してこそいませんが、loopbackを配布しているStrongLoopがアプリケーション管理に使えるツールを付加しているんだと思います。
たとえば、``slc``コマンドとか。（``slc``コマンドについては[こちら](https://strongloop.com/strongblog/slc-create-boilerplate-for-node-modules-and-applications-easily/)が参考になるかと。）

# 基本構成を作成する
## Yoemanで基本構成を作成する
Yeomanで基本構成を作ります。所要時間は5分もかからない程度です。

```shell-session

% yo loopback

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

? What's the name of your application? (xxxx) sample[Enter]

【中略】

Next steps:

  Create a model in your app
    $ yo loopback:model

  Optional: Enable StrongOps monitoring
    $ slc strongops

  Run the app
    $ node .
```

ここまでくれば、とりあえず形ができています。

## 構成の概要
おおまかに概要を。詳しくは[こちら](http://docs.strongloop.com/display/public/LB/Project+layout+reference)。

* server　：Nodeアプリケーションのスクリプト本体・設定ファイルを保存
 * server.js　：アプリケーションのメインプログラム
 * config.json　：アプリケーション設定ファイル
 * datasources.json　：データソース設定ファイル（データの保持方法などを指定）
 * middleware.json　：RESTアクセスがあった場合の挙動を変える機能の指定などの設定
 * model-config.json　：モデルとデータソースのBindに関する設定ファイル
 * boot　：Node起動時に使用するスクリプトを格納するディレクトリ
* client　：クライアント向けアプリケーション用のファイルを格納するディレクトリ
* common　：Nodeアプリ・クライアントアプリ双方の共有ディレクトリ
 * model　：カスタムで作成したモデルのファイルや機能のスクリプトを格納するディレクトリ
* node_modules　：Nodeおなじみ
* package.json　：Nodeおなじみ（npm管理用）
* README.md　：一般的におなじみのREADMEを記載するファイル

# モデルを作る
Next Stepsに書いてあった通り、Loopback内で使うモデルを作成する。Yeomanで1～2分でできます。

```shell-session

% yo loopback:model
```

## モデルの名前を指定する
上記では、まずは名前を指定します。任意です。
ここでは、「SampleModel」という名前にします。

```shell-session

? Enter the model name: SampleModel [Enter]
```

## モデルの保持方法の指定
次はモデルの保持方法。
DBに値を保存する等をここで選びますが、DBに保存するために必要なパッケージは
まだ入れていない状態なので、選べるものは限られます。
ここでは、Nodeが起動している間はメモリ内で保持される``db (memory)``を指定します。

```shell-session

? Select the data-source to attach SampleModel to: db (memory) [Enter] 
```

## 親クラスの指定
モデルのベースとなる親クラスを指定します。
もっともシンプルな親クラスとしては``Model``ですが、
これをExtendしてCRUDサポートを持っている``PersistedModel``を指定します。

```shell-session

? Select model's base class: PersistedModel [Enter] 
```

## その他の設定
REST APIで使用するか、RESTで使用するURLはどうするかが聞かれます。

ここでは、RESTとして使用するので、１問目はYesを指定し、
REST URLは特に気にしないので、２問目は何もいれずにEnterします。

```shell-session

? Expose SampleModel via the REST API? Yes [Enter]
? Custom plural form (used to build REST URL): [Enter]
```
これらが終わると、モデルの大枠を作ってくれます。


## プロパティを指定する。
```shell-session

Let's add some SampleModel properties now.
```
これが出ると、プロパティを指定する準備ができた状態になります。

とりあえず、「prop1」という名前のStringを扱う必須プロパティを作成します。

```shell-session

Enter an empty property name when done.
? Property name: prop1[Enter]
   invoke   loopback:property
? Property type: string[Enter]
? Required? Yes[Enter]
```

```
Let's add another SampleModel property.
```
これが出ると、１つ目のプロパティ定義は完了です。
さらにプロパティを増やす場合はこれを繰り返し続けます。
終わる場合は、プロパティ名を指定せず、単純にEnterを押すと抜けれます。

```shell-session

Enter an empty property name when done.
? Property name: [Enter]
```

これでモデルが出来上がりました。

## 内容の確認
モデルを格納する「common/models」配下に下記のファイルがあればOKです。

```json:sample-model.json
{
  "name": "SampleModel",
  "base": "PersistedModel",
  "idInjection": true,
  "properties": {
    "prop1": {
      "type": "string",
      "required": true
    }
  },
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": []
}
```

```js:sample-model.js
module.exports = function(SampleModel) {

};
```

# nodeの起動
作ったやつらが動くかどうかを確認してみます。

```shell-session
% node .
```

動いたところで、「 http://localhost:3000/explorer 」にブラウザからアクセスします。
Expressのインターフェースが表示されます。

SampleModelsの下にずらずらと並んでいる分がデフォルトで提供されているRESTサービスです。

![rest-list.png](https://qiita-image-store.s3.amazonaws.com/0/19870/8d16a0e5-a3a9-48db-83d8-b194cf941b4c.png)

## たとえば、データを作ってみる。(POST)

こんな感じのサンプルデータを登録してみる。（dataの部分）

![POST-input.png](https://qiita-image-store.s3.amazonaws.com/0/19870/07bed5fd-53ea-9a29-e413-96ea796dae83.png)

「Try it out!」ボタンを押すと、登録される。

![POST-result.png](https://qiita-image-store.s3.amazonaws.com/0/19870/3294a90e-a592-8229-8591-bb0d65132bfd.png)

## 登録したデータを確認する(GET)

登録したデータを参照する。
![GET-input.png](https://qiita-image-store.s3.amazonaws.com/0/19870/7ed8705a-052b-0e07-7836-03b2763f3804.png)

条件は特にないので、そのまま「Try it out!」ボタンを押すと、参照結果が表示される。

![GET-result.png](https://qiita-image-store.s3.amazonaws.com/0/19870/712f5933-397c-046a-226c-a43c9e9f97be.png)

１時間くらいでそれなりに使えるものができて、ありがたいですに。